筛约数个数和

理论基础:

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/

约数定理(two)的更多相关文章

  1. codeforces 1183F 离散化枚举 约数定理

    codeforces1183F 有技巧的暴力 传送门:https://codeforces.com/contest/1183/problem/F 题意: 给你n个数,要你从中选出最多三个数,使得三个数 ...

  2. ●BZOJ 3994 [SDOI2015]约数个数和

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3994 题解: 莫比乌斯反演 (先定义这样一个符号[x],如果x为true,则[x]=1,否则 ...

  3. 聪明的燕姿[JLOI2014]

    题目描述 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌 ...

  4. BZOJ1053: [HAOI2007]反素数ant(爆搜)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 2485[Submit][Status][Discuss] Descript ...

  5. 从“n!末尾有多少个0”谈起

    在学习循环控制结构的时候,我们经常会看到这样一道例题或习题.问n!末尾有多少个0?POJ 1401就是这样的一道题. [例1]Factorial (POJ 1401). Description The ...

  6. 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest C.Divisors of the Divisors of An Integer (数论)

    题意:求\(n!\)的每个因子的因子数. 题解:我们可以对\(n!\)进行质因数分解,这里可以直接用推论快速求出:https://5ab-juruo.blog.luogu.org/solution-p ...

  7. hdu1492(约数个数定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1492 这里先讲一下约数个数定理: 对于正整数x,将其质因分解为 x = pow(p1, a) * po ...

  8. poj 1845 Sumdiv 约数和定理

    Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...

  9. 【搜索】【约数个数定理】[HAOI2007]反素数ant

    对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数. 所以,n以内的反质数即为不超过n的 ...

随机推荐

  1. Java ——异常处理

    本节重点思维导图 详细戳——> 异常处理

  2. SIRIM上海,http://www.sirim-global.com

    SIRIM上海 http://www.sirim-global.com

  3. nrm安装与配置

    nrm安装与配置:https://blog.csdn.net/anway12138/article/details/79455224

  4. uboot 主Makefile分析

    一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...

  5. c++多线程并发学习笔记(2)

    等待一个时间或其他条件 在一个线程等待完成任务时,会有很多选择: 1. 它可以持续的检查共享数据标志(用于做保护工作的互斥量),直到另一个线程完成工作时对这个标志进行重设.缺点:资源浪费,开销大 2. ...

  6. Period II

    For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the ...

  7. FFmpeg SDK开发模型之中的一个:解码器

    简单介绍 本例解说了怎样使用ffmpeg SDK解码媒体文件: 參考源代码是ffmpeg 自带的apiexample.c 一.源代码#include <stdlib.h>#include ...

  8. js实现404页面倒计时跳转

    <script type="text/javascript"> (function(){ var i=5,timer=null,number=document.getE ...

  9. 使用SecureCRT 8.5快速打开sftp传输文件

    一般使用Windows系统上安装的SecureCRT 8.5软件远程连接Linux服务器,通常给Linux系统传输文件或者使用FTP,或者使用SFTP等其他第三方软件,有时Linux系统上还需要做其他 ...

  10. Animator通过按键切换动画不及时,动画延时切换问题

    再unity3D版本为Unity 5.2.1f1 (64-bit),再设置动画切换时有一个Has Exit Time属性,由于勾上了这个的原因