筛约数个数和

理论基础:

1、对n质因数分解,n=p1^k1 * p2^k2 * p3^k3 ……

则n的约数个数为(k1+1)*(k2+1)*(k3+1)……

2、线性筛素数时,用i和素数pj来筛掉 i*pj,

其中pj一定是i*pj的最小素因子

如果i是pj的倍数,pj也是i的最小素因子

设t[i] 表示i的约数个数,e[i] 表示i的最小素因子的个数

A、如果i是质数,t[i]=2,e[i]=1

B、如果i不是质数,枚举已有的质数pj

i*pj的最小素因子是pj

1、如果i是pj的倍数那么e[i]即为i中包含的pj的个数,所以i*pj中包含的pj的个数为e[i]+1

所以e[i*pj]=e[i]+1,t[i*pj]=t[i]/(e[i]+1)*(e[i]+2)

2、如果i不是pj的倍数,e[i*pj]=1,t[i*pj]=t[i]*t[pj](积性函数的性质)=t[i]*2(素数的约数个数=2)

 #include<cstdio>

 using namespace std;

 #define N 1000001

 bool vis[N];
int prime[N]; int t[N],e[N]; int main()
{
int n;
scanf("%d",&n);
int cnt=;
t[]=;
for(int i=;i<=n;++i)
{
if(!vis[i])
{
prime[++cnt]=i;
t[i]=;
e[i]=;
}
for(int j=;j<=cnt;++j)
{
if(i*prime[j]>n) break;
vis[i*prime[j]]=true;
if(i%prime[j]==)
{
t[i*prime[j]]=t[i]/(e[i]+)*(e[i]+);
e[i*prime[j]]=e[i]+;
break;
}
else
{
t[i*prime[j]]=t[i]*;
e[i*prime[j]]=;
}
}
}
long long ans=;
for(int i=;i<=n;++i) ans+=t[i];
printf("%lld",ans);
}

筛约数和

t[i] 表示i的约数和

e[i] 表示i的约数中,不能被i的最小素因子整除的约数和

A、i是质数,t[i]=i+1,e[i]=1

B、i不是质数

i*pj的最小素因子是pj

1、如果i不是pj的倍数,那么i的所有约数中,必然没有pj的倍数

可以用反证法证明这个:设x是i的约数,且x是pj的倍数,

那么 x=pj*b,i=x*a=pj*b*a

即i是pj的b*a倍,与i不是pj的倍数相矛盾

令S表示i的约数集,S’表示i的约数翻pj倍后的数的集合

则S∩S’=∅,则S和S’中无重复元素

所以t[i*pj]=S+S'=t[i]+t[i]*pj=t[i]*(pj+1)

S’中的所有元素都能整除pj,所以e[i*pj]=t[i]

2、如果i是pj的倍数,那么S和S’必有交集T

T=S中pj的倍数

所以i*pj的约数和要去除交集T

那么t[i*pj]=S+S'-T=S'+S-T=t[i]*pj+e[i]

因为pj既是i的最小素因子,有事i*pj的最小素因子

所以e[i*pj]=e[i]

 #include<cstdio>

 typedef long long LL;

 #define N 100001

 int prime[N];
bool vis[N]; LL t[N],e[N]; int main()
{
int n;
scanf("%d",&n);
int cnt=;
for(int i=;i<=n;++i)
{
if(!vis[i])
{
prime[++cnt]=i;
t[i]=i+;
e[i]=;
}
for(int j=;j<=cnt;++j)
{
if(prime[j]*i>n) break;
vis[prime[j]*i]=true;
if(i%prime[j]==)
{
t[i*prime[j]]=t[i]*prime[j]+e[i];
e[i*prime[j]]=e[i];
break;
}
t[i*prime[j]]=t[i]*(prime[j]+);
e[i*prime[j]]=t[i];
}
}
LL ans=;
for(int i=;i<=n;++i) ans+=t[i];
printf("%lld",ans);
}

参考博客:

百度百科

https://blog.csdn.net/Anxdada/article/details/76691441

http://www.cnblogs.com/TheRoadToTheGold/

最新文章

  1. jquery的.html(),.text()和.val()方法
  2. Saltstack之SSH(十一)
  3. C++中的异常处理(二)
  4. Oracle ——————建表、select、视图
  5. BZOJ 1047 理想的正方形(单调队列)
  6. 在PowerDesigner中设计物理模型3——视图、存储过程和函数
  7. 【暑假】[实用数据结构]UVAlive 3644 X-Plosives
  8. Mongodb中Sharding集群
  9. 【Tomcat】使用Eclipse发布项目时,项目启动路径错误。
  10. SpringBoot 分布式session
  11. LCD 显示异常定位分析方法
  12. 一些面试题(关于string的)
  13. Python图表数据可视化Seaborn:4. 结构化图表可视化
  14. session token两种登陆方式
  15. 20172302 《Java软件结构与数据结构》第六周学习总结
  16. vue:vue-resource
  17. MBTIles实现
  18. Linux下onvif客户端获取ipc摄像头 GetServices:获取媒体地址(有的h265摄像头必须要这个接口)
  19. 国密算法--Openssl 实现国密算法(加密和解密)
  20. C++禁止使用拷贝构造函数和赋值运算符方法

热门文章

  1. python接口自动化:绕过验证码登录
  2. input标签内容改变时触发事件
  3. Mysql 5.7存储过程的学习
  4. HDU-1018 BigNumber
  5. http请求响应丢包问题
  6. Springboot+CAS单点登录
  7. 如何查看Win10开机运行了多长时间 - Windows10.Pro
  8. wordpress各个文件作用详解
  9. 常用的前端框架Angular、React、Vue
  10. netstat - 显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组。