[SPOJ]DIVCNT3
别人写的讲得挺好的博客
洲阁筛,一种快速求积性函数前缀和的算法
求$\sum\limits_{i=1}^nF(i)$,其中$F(x)$是积性函数,并且$F(p^c)$是关于$p$的低阶多项式
我们把$1\cdots n$的所有数按是否有$\gt\sqrt n$的质因子分类,那么
$\sum\limits_{i=1}^nF(i)=\sum\limits_{\substack{1\leq i\leq n\\i\,没有\,\gt\sqrt n\,的质因子}}F(i)\left(1+\sum\limits_{\substack{\sqrt n\lt j\leq\left\lfloor\frac ni\right\rfloor\\j\,是质数}}\right)$
当$i\geq\sqrt n$时括号内为$1$,所以我们需要计算两部分
1.对$\forall1\leq i\lt\sqrt n$,计算$\sum\limits_{\substack{\sqrt n\lt j\leq\left\lfloor\frac ni\right\rfloor\\j\,是质数}}F(j)$
2.$\sum\limits_{\substack{\sqrt n\leq i\leq n\\i\,没有\,\gt\sqrt n\,的质因子}}F(i)$
因为$F(p)$是关于$p$的低阶多项式,所以问题转化为求一定范围内的质数幂和
设$g_k(i,j)$表示$[1,j]$中与前$i$个质数互质的数的$k$次幂和,$\leq\sqrt n$的质数有$m$个,我们要求的是$g_k\left(m,\left\lfloor\frac ni\right\rfloor\right)-1$
边界:$g_k(0,i)=\sum\limits_{j=1}^ij^k$,因为$F(p)$是关于$p$的低次多项式,这意味着$k$比较小,那么此式可以快速计算
转移:$g_k(i,j)=g_k(i-1,j)-p_i^kg_k\left(i-1,\left\lfloor\frac j{p_i}\right\rfloor\right)$,减去的是最小质因子$=p_i$的数
因为$j=\left\lfloor\frac n{p_\cdots}\right\rfloor$,所以它的取值只有$O(\sqrt n)$种
当$p_i\gt\left\lfloor\frac j{p_i}\right\rfloor$即$p_i^2\gt j$时,$g_k(i,j)=g_k(i-1,j)-p_i^k$,所以对于一个$j$,我们从小到大枚举$i$,一旦遇到一个$i_0$满足此式,我们以后都不用转移它了,要用到它在$i_1$处的值时减去$\sum\limits_{l=i_0}^{i_1}p_l^k$即可
设$f(i,j)$表示$[1,j]$中仅由$\leq\sqrt n$的后$i$个质数组成的数的$F(x)$之和,我们要求的是$f(m,n)-f(m,\sqrt n-1)$
边界:$f(0,i)=1$
转移:$f(i,j)=f(i-1,j)+\sum\limits_{c\geq1}F(p_i^c)f\left(i-1,\left\lfloor\frac j{p_i^c}\right\rfloor\right)$,加上的是最小质因子$=p_i$的数
同样地,$j$的取值只有$O(\sqrt n)$种
当$p_i^2\gt j$时,$f(i,j)=f(i-1,j)+F(p_i)$,所以我们从大到小枚举质数$p_i$,满足此式时不转移,要用到它的值时加上$[p_i,\min(j,\sqrt n)]$中的质数的$F(p)$即可
总时间复杂度$O\left(\frac{n^{\frac34}}{\log n}\right)$,作者水平不足,证明从略
现在来看spoj上的DIVCNT3,这里$\sigma_0\left(\left(p^c\right)^3\right)=3c+1$,是常数,所以1只用筛质数个数,初始化也很好处理
我的写法可能有一些问题,跑起来挺慢的...
#include<stdio.h> typedef long long ll; const ll T=316500,maxn=635000; ll pr[T+10],md[T+10],c[T+10],d3[T+10],s3[T+10]; bool np[T+10]; void sieve(){ ll i,j,M; M=0; md[1]=1; c[1]=1; d3[1]=1; for(i=2;i<=T;i++){ if(!np[i]){ M++; pr[M]=i; md[i]=i; c[i]=1; d3[i]=4; } for(j=1;j<=M&&i*pr[j]<=T;j++){ np[i*pr[j]]=1; if(i%pr[j]==0){ md[i*pr[j]]=md[i]*pr[j]; c[i*pr[j]]=c[i]+1; d3[i*pr[j]]=d3[i/md[i]]*((c[i]+1)*3+1); break; } md[i*pr[j]]=pr[j]; c[i*pr[j]]=1; d3[i*pr[j]]=d3[i]*4; } } for(i=1;i<=T;i++)s3[i]=s3[i-1]+d3[i]; } const ll mod=1000007; struct map{ ll h[mod],nex[maxn],to[maxn],id[maxn],v[maxn],M; void clear(ll n){ M=0; for(ll i=1;i<=n;i=n/(n/i)+1)h[n/i%mod]=0; } ll&operator[](ll x){ for(ll i=h[x%mod];i;i=nex[i]){ if(id[i]==x)return v[i]; } M++; id[M]=x; nex[M]=h[x%mod]; h[x%mod]=M; return v[M]; } }h; ll bl[maxn],g[maxn],i0[maxn],n,m,C; void getg(){ ll i,j,k; C=0; h.clear(n); for(i=1;i<=n;i=n/(n/i)+1){ C++; bl[C]=n/i; g[C]=n/i; i0[C]=0; h[n/i]=C; } for(i=1;i<=m;i++){ for(j=1;j<=C&&pr[i]*pr[i]<=bl[j];j++){ k=h[bl[j]/pr[i]]; g[j]-=g[k]-(i-1-i0[k]); i0[j]=i; } } for(i=1;i<=C&&pr[m]<=bl[i];i++)g[i]-=m-i0[i]; } ll f[maxn],mp[maxn]; bool us[maxn]; ll ck(ll a,ll b){return a>b?a-b:0;} void getf(){ ll i,j,c,t,p; mp[0]=m; for(i=1;i<=C;i++){ us[i]=0; f[i]=1; for(j=mp[i-1];pr[j]>bl[i];j--); mp[i]=j; } for(i=m;i>0;i--){ for(j=1;j<=C&&pr[i]*pr[i]<=bl[j];j++){ if(!us[j]){ f[j]+=ck(mp[j],i)*4; us[j]=1; } for(c=1,t=pr[i];t<=bl[j];c++,t*=pr[i]){ p=h[bl[j]/t]; f[j]+=(f[p]+(us[p]?0:ck(mp[p],i)*4))*(3*c+1); } } } for(i=1;i<=C;i++){ if(!us[i])f[i]+=mp[i]*4; } } void work(){ ll i,sq,ans; scanf("%lld",&n); if(n<=T){ printf("%lld\n",s3[n]); return; } for(m=1;pr[m]*pr[m]<=n;m++); m--; getg(); getf(); for(sq=1;sq*sq<n;sq++); sq--; ans=f[1]-f[h[sq]]; for(i=1;i<=sq;i++)ans+=d3[i]*((g[h[n/i]]-1)*4+1); printf("%lld\n",ans); } int main(){ sieve(); ll cas; scanf("%lld",&cas); while(cas--)work(); }
DIVCNTK被卡常了,鈤
[SPOJ]DIVCNT3的更多相关文章
- 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3
Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...
- SPOJ:[DIVCNT3]Counting Divisors
题目大意:求1~N的每个数因子数的立方和. 题解:由于N过大,我们不能直接通过线性筛求解.我们可以采用洲阁筛. 洲阁筛的式子可以写成: 对于F(1~√n),可以直接线性筛求解. 对于,我们进行以下DP ...
- SPOJ divcntk(min25筛)
题意 \(\sigma_0(i)\) 表示 \(i\) 的约数个数 求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\pmod {2^{64}} \] 共 \(T\) 组数据 ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
随机推荐
- 这次OpenSSL HeartBleed漏洞是怎么一回事呢?
“心脏出血”(Heartbleed)被称为互联网史上最严重的安全漏洞之一,波及了大量常用网站.服务,包括很多人每天都在用的 Gmail 等等,可能导致用户的密码.信用卡轻易泄露.但是我们可能对它还不是 ...
- Bash 实例,第二部分
我们先看一下处理命令行自变量的简单技巧,然后再看看 bash 基本编程结构. 接收自变量 在 介绍性文章 中的样本程序中,我们使用环境变量 "$1" 来引用第一个命令行自变量.类似 ...
- bootstrap再次回顾认识到的东西
1,需要使用html5文档类型(Doctype),因此在使用bootstrap项目的开头包含下面的代码段. <!DOCTYPE html> <html> ....... < ...
- DOM常用对象
一.select对象 HEML中的下拉列表 属性: 1.options 获得当前select下所有option 2.options[i] 获得当前select下i位置的option 3.selecte ...
- HDOJ 3501 Calculation 2
题目链接 分析: 要求的是小于$n$的和$n$不互质的数字之和...那么我们先求出和$n$互质的数字之和,然后减一减就好了... $\sum _{i=1}^{n} i[gcd(i,n)==1]=\le ...
- bzoj4128 Matrix
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 [题解] 矩阵版本的BSGS. 至于如何不需要求逆,详见:http://www.cnb ...
- 51nod 1020 逆序排列——dp
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...
- 最短路算法详解(Dijkstra,Floyd)
最短路径 在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1.由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过 ...
- NYOJ 170 网络的可靠性 (数学)
题目链接 描述 A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助商.它将提供先进的网络协作技术,展示其"智能+互联"的生活概念,同时为参观者提供高品质的个人体 ...
- 端到端测试,protractor测试的教程
之前我们介绍了如何测试某段js代码的逻辑是否正确,考虑的情况是否全面,但是在ui界面上我们每次做好的功能都要自己去填写内容,点击按钮等,那么是否存在自动化测试的工具呢,让这些事情可以自动完成,答案是肯 ...