[Spoj]Counting Divisors (cube)
来自FallDream的博客,未经允许,请勿转载,谢谢。
设d(x)表示x的约数个数,求$\sum_{i=1}^{n}d(i^{3})$
There are 5 Input files.
- Input #1: 1≤N≤10000, TL = 1s.
- Input #2: 1≤T≤300, 1≤N≤10^8, TL = 20s.
- Input #3: 1≤T≤75, 1≤N≤10^9, TL = 20s.
- Input #4: 1≤T≤15, 1≤N≤10^10, TL = 20s.
- Input #5: 1≤T≤2, 1≤N≤10^11, TL = 20s.
$i^{3}$的约数个数$d(i^{3})$是一个积性函数,所以转而求$d(x)=\prod{F(pi^{ci})}$,其中$F ( pk ^ {ck} )=3ck+1$
可以直接洲阁筛 学了一天大概懂了 顺便抄了个模板
-----
gi表示1-i中与前j个质数互质的数字的F之和
fi表示1-i中由小于根号n的后j个质数组成的数字的F之和
容易得出转移方程 $$g[i][j]=g[i][j]-F(pk)g[\frac{i}{pk}][j-1]$$
$$ f[i][j]=f[i][j-1]+\sum_{ck>=1}F(pk^{ck})f[\frac{i}{pk^{ck}}][j]$$
显然i只有根号种取值 对于每个根号n以内的质数都要转移,复杂度$O(\frac{n}{\log n})$
考虑优化,显然$p_{j+1}>i$的时候,g[i][j]=4(3*1+1)
所以当$pj^{2}>i$的时候,g[i][j]=g[i][j-1]+F(pi) 可以不用转移,用的时候补上那一段即可。
之所以把f的状态表示成"后j个",也是出于这个目的
这样的复杂度近似是$O(\frac{n^{\frac{3}{4}}}{logn})$
然后线筛出根号n以内的F[],答案是$f[n]+\sum_{i=1}^{\sqrt{n}}F[i]g[\frac{n}{i}]$
#include<iostream>
#include<cstdio>
#include<cmath>
#define MN 320000
#define ll long long
using namespace std;
inline ll read()
{
ll x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
} int s[MN+],num=,last[MN+],l[MN+],l0[MN+],sq,P,N[MN+];
ll f0[MN+],f[MN+],g0[MN+],g[MN+],d[MN+],n;
bool b[MN+]; void CalcF()
{
for(int i=;i<=sq;++i) f[i]=f0[i]=;
for(int i=P-;i;--i)
{
for(int j=;j<=sq&&l[j]>i;++j)
{
ll now=(n/j)/s[i];
for(int tms=;now;now/=s[i],tms+=)
{
if(now<=sq) f[j]+=tms*(f0[now]+*(max(,N[now]-max(i+,l0[now])+)));
else f[j]+=tms*(f[n/now]+*max(,P-max(i+,l[n/now])));
}
}
for(int j=sq;j&&l0[j]>i;--j)
{
ll now=j/s[i];
for(int tms=;now;tms+=,now/=s[i])
f0[j]+=tms*(f0[now]+*max(,N[now]-max(i+,l0[now])+));
}
}
for(int i=;i<=sq;++i) f[i]+=*(P-l[i]);
} void CalcG()
{
for(int i=;i<=sq;++i)
g0[i]=i,g[i]=n/i;
for(int i=;i<P;++i)
{
for(int j=;j<=sq&&l[j]>i;++j)
{
ll now=n/j/s[i];
if(now<=sq) g[j]-=g0[now]-max(,i-l0[now]);
else g[j]-=g[n/now]-max(,i-l[n/now]);
}
for(int j=sq;j&&l0[j]>i;--j)
g0[j]-=g0[j/s[i]]-max(,i-l0[j/s[i]]);
}
for(int i=;i<=sq;++i) g[i]-=P-l[i];
} int main()
{
d[]=;
for(int i=;i<=MN;++i)
{
if(!b[i]) s[++num]=last[i]=i;
for(int j=;s[j]*i<=MN;++j)
{
b[s[j]*i]=,last[s[j]*i]=s[j];
if(i%s[j]==) break;
}
int sum=,tms,p;
for(int j=i;j>;)
{
tms=;p=last[j];
for(;j%p==;j/=p,++tms);
sum*=(tms*+);
}
d[i]=sum;
N[i]=N[i-]+(!b[i]);
}
for(int T=read();T;--T)
{
n=read();sq=sqrt(n);l[sq+]=;
for(P=;1LL*s[P]*s[P]<=n;++P);
for(int i=;i<=sq;++i)
for(l0[i]=l0[i-];1LL*s[l0[i]]*s[l0[i]]<=i;++l0[i]);
for(int i=sq;i;--i)
for(l[i]=l[i+];1LL*s[l[i]]*s[l[i]]<=n/i;++l[i]);
CalcF();CalcG();
ll ans=f[];
for(int i=;i<=sq;++i)
ans+=*d[i]*(g[i]-);
printf("%lld\n",ans);
}
return ;
}
[Spoj]Counting Divisors (cube)的更多相关文章
- [SPOJ20174]DIVCNT3 - Counting Divisors (cube):Min_25筛
分析 首先,STO ywy OTZ,ywy TQL%%%! 说一下这道题用min_25筛怎么做. 容易发现,对于所有质数\(p\),都满足\(f(p)=4\),于是我们就可以直接通过\([1,x]\) ...
- DIVCNT2&&3 - Counting Divisors
DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...
- SPOJ 20713 DIVCNT2 - Counting Divisors (square)
DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ0 ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- HDU 6069 Counting Divisors
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors(求因子的个数)
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors 筛法
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...
- hdu6069 Counting Divisors 晒区间素数
/** 题目:hdu6069 Counting Divisors 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意:求[l,r]内所有数的k次方 ...
随机推荐
- org.hibernate.hibernate.connection.release_mode
org.hibernate.connection包的主要封装了通过JDBC来连接数据库的操作,用户可以以数据源的方式,或者通过特定数据库驱动的方式,甚至是自己定义连接类的方式来完成数据库的连接操作,包 ...
- 《高级软件测试》Linux平台Jira的安装与配置
现在大部分的程序开发都是在linux下进行的,jira更多的时候是安装在linux上,那么,如何在linux下安装配置jira呢?本文将以Ubuntu 17.10和jira7.5.2为例,对linux ...
- bzoj千题计划244:bzoj3730: 震波
http://www.lydsy.com/JudgeOnline/problem.php?id=3730 点分树内对每个节点动态维护2颗线段树 线段树以距离为下标,城市的价值为权值 对于节点x的两棵线 ...
- Android接受验证码自动填入功能(源码+已实现+可用+版本兼容)
实际应用开发中,会经常用到短信验证的功能,这个时候如果再让用户就查看短信.然后再回到界面进行短信的填写,难免有多少有些不方便,作为开发者.本着用户至上的原则我们也应该来实现验证码的自动填写功能,还有一 ...
- 成功案例分享:raid5两块硬盘掉线数据丢失恢复方法
1. 故障描述 本案例是HP P2000的存储vmware exsi虚拟化平台,由RAID-5由10块lT硬盘组成,其中6号盘是热备盘,由于故障导致RAID-5磁盘阵列的两块盘掉线,表现为两块硬 ...
- ASP.NET 访问项目网站以外的目录文件
简单的说,可以通过在 IIS 添加虚拟目录的方法做到,获取访问路径的时候就用 HttpContext.Current.Server.MapPath("~/xxx"); 的方式. 下 ...
- Mego开发文档 - 索引
Mego 开发文档 Mego 快速概述 主要特性 获取Mego 使用流程 模型 查询 保存数据 入门 Mego 快速开始 创建项目 安装Nuget包 创建连接字符串 创建模型及数据上下文(添加引用) ...
- GIT入门笔记(10)- 多种撤销修改场景和对策
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...
- 移动端登录页面input获取焦点后页面布局及输入框上移的问题
最近切微信页面的时候,发现移动端的登录页面,带输入框的那种,如图: 从页面本身来看没有什么问题,上传至测试服务器,用iphone访问也没有什么问题,但是当同事用Android手机获取焦点后,问题来了, ...
- oracle批量插入优化方案
今天听DBA说如果从一个表批量查询出一批数据之后批量插入另外一张表的优化方案: 1)不写归档日志: 2)采用独占 关于insert /*+ append */我们需要注意以下三点: a.非归档模式下, ...