[SPOJ20174]DIVCNT3 - Counting Divisors (cube):Min_25筛
分析
首先,STO ywy OTZ,ywy TQL%%%!
说一下这道题用min_25筛怎么做。
容易发现,对于所有质数\(p\),都满足\(f(p)=4\),于是我们就可以直接通过\([1,x]\)内的质数的个数\(h(x)\)来求出\(g(x)=\sum_{i=1}^{x}f(i) \times [i \in prime]\)了,即\(g(x)\)可以等价地表示为\(g(x)=4 \times h(x)\)。如何求\(h(x)\)是min_25筛的基本操作就不过多赘述了。而且进一步分析我们可以得出,\(f(p^q)=3 \times q+1,p \in prime\),这个结论在实现min_25筛时也很重要。
代码里的g[x]其实是我上面写的\(h(x)\)。
说一句题外话,min_25筛的话,使用哈希表实现更直观,但是如果用id1,id2两个数组实现的话常数会显著减小(哈希表的地方我注释掉了)。
代码
#include <bits/stdc++.h>
#define rin(i,a,b) for(register int i=(a);i<=(b);++i)
#define irin(i,a,b) for(register int i=(a);i>=(b);--i)
#define trav(i,a) for(register int i=head[a];i;i=e[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;
inline LL read(){
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const LL MAXN=1e11+5;
const int MAXR=1e6+5;
const int HMOD=3e6-1;
LL n,num[MAXR],g[MAXR];
int cnt,tot,prm[MAXR],id1[MAXR],id2[MAXR];
bool vis[MAXR];
/*
struct Hash_Map{
int siz,head[HMOD+5],nxt[MAXR],to[MAXR],sta[MAXR],top;
LL val[MAXR];
inline void insert(LL x,int y){
++siz;
nxt[siz]=head[x%HMOD];
val[siz]=x;
to[siz]=y;
head[x%HMOD]=siz;
sta[++top]=x%HMOD;
}
inline int operator [] (LL x){
for(register int i=head[x%HMOD];i;i=nxt[i])
if(val[i]==x) return to[i];
}
void clear(){
siz=0;
while(top) head[sta[top--]]=0;
}
}mp;
*/
void pre_process(int n){
rin(i,2,n){
if(!vis[i]) prm[++cnt]=i;
rin(j,1,cnt){
if(i*prm[j]>n) break;
vis[i*prm[j]]=true;
if(i%prm[j]==0) break;
}
}
}
LL solve(LL x,int y){
// int k=mp[x];
int k=x<=MAXR-5?id1[x]:id2[n/x];
LL ret=(g[k]<<2)-((y-1)<<2);
rin(i,y,cnt){
if(1ll*prm[i]*prm[i]>x) break;
LL temp1=prm[i],temp2=1ll*prm[i]*prm[i];
for(register int j=1;temp2<=x;++j,temp1=temp2,temp2*=prm[i])
ret+=(3*j+1)*solve(x/temp1,i+1)+3*j+4;
}
return ret;
}
int main(){
int T=read();
pre_process(500000);
while(T--){
tot=0;
// mp.clear();
n=read();
LL nxti;
for(register LL i=1;i<=n;i=nxti){
nxti=n/(n/i)+1;
num[++tot]=n/i;
// mp.insert(num[tot],tot);
if(num[tot]<=MAXR-5) id1[num[tot]]=tot;
else id2[nxti-1]=tot;
g[tot]=num[tot]-1;
}
rin(i,1,cnt){
if(1ll*prm[i]*prm[i]>n) break;// 这个一定要加,否则会T第一个点!
rin(j,1,tot){
if(1ll*prm[i]*prm[i]>num[j]) break;
// int k=mp[num[j]/prm[i]];
int k=num[j]/prm[i]<=MAXR-5?id1[num[j]/prm[i]]:id2[n/(num[j]/prm[i])];
g[j]-=g[k]-(i-1);
}
}
printf("%lld\n",solve(n,1)+1);
}
return 0;
}
[SPOJ20174]DIVCNT3 - Counting Divisors (cube):Min_25筛的更多相关文章
- SP34096 DIVCNTK - Counting Divisors (general)(Min_25筛)
题面 洛谷 \(\sigma_0(i)\) 表示\(i\) 的约数个数 求\(S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\mod 2^{64}\) 多测,\(T\le10^4,n ...
- [Spoj]Counting Divisors (cube)
来自FallDream的博客,未经允许,请勿转载,谢谢. 设d(x)表示x的约数个数,求$\sum_{i=1}^{n}d(i^{3})$ There are 5 Input files. - Inpu ...
- hdu 6069 Counting divisors 公式+区间筛
比赛的时候把公式扣出来了,,但是没有想到用筛法算公因子,,默默学习一下.. 题解:设n=p1^(c1)p2^{c2}...pm^{cm},n=p1^c1*p2^c2...p ...
- SPOJ:[DIVCNT3]Counting Divisors
题目大意:求1~N的每个数因子数的立方和. 题解:由于N过大,我们不能直接通过线性筛求解.我们可以采用洲阁筛. 洲阁筛的式子可以写成: 对于F(1~√n),可以直接线性筛求解. 对于,我们进行以下DP ...
- DIVCNT2&&3 - Counting Divisors
DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
- 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次方 ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
随机推荐
- 记一次程序从x86_64linux平台移植到armv7平台
前言 最近接了个任务,需要把代码移植到armv7平台,搜寻相关方法,了解到可以利用交叉编译工具如:gcc-linaro-arm-linux-gnueabihf.把自己依赖的第三方库代码和自己代码分别编 ...
- numpy-tile 数组复制
tile(A, reps):把数组A复制成新数组 # 把 矩阵 看做一个整体,第二个参数代表把 矩阵 复制 m*n 次 b = np.arange(1, 5).reshape(2, 2) print( ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing
题意:在这个寒假中,鲍勃有计划在山区度假胜地滑雪.这个滑雪胜地有M个不同的滑雪道和N个不同的标志位于那些转弯处点.从第S标记到第T标志的第i路径具有长度L.每个路径必须遵循降低高度的原则,起点必须严格 ...
- RabbitMQ入门教程(十四):RabbitMQ单机集群搭建
原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- java中常见的异常种类
Java常见的异常种类 ------------------------------------------------------------------------------- java Exc ...
- iptables-restore - 恢复 IP Tables
总览 SYNOPSIS iptables-restore [-c] [-n] 描述 DESCRIPTION iptables-restore 用来从 STDIN 给出的数据中恢复 IP Tables. ...
- 003-SaltStack入门篇之远程执行和配置管理
第一条命令: [root@linux-node1 master]# salt '*' test.ping linux-node2.example.com: True linux-node1.examp ...
- canvas在高倍屏下变模糊的处理办法
因为canvas不是矢量图,而是像图片一样是位图模式的.如果不做Retina屏适配的话,例如二倍屏,浏览器就会以2个像素点的宽度来渲染一个像素,该canvas在Retina屏幕下相当于占据了2倍的空间 ...
- Web Api 接口测试工具:WebApiTestClient
前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗.由于接口个数有点多,每 ...
- js前台页面显示中文,后台存对应的value值实现
field: 'rightType', title: '权益类型', //width: 100, align: 'left', valign: 'top', sortable: true, forma ...