约数定理(two)

筛约数个数和
理论基础:
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)的更多相关文章
- codeforces 1183F 离散化枚举 约数定理
		codeforces1183F 有技巧的暴力 传送门:https://codeforces.com/contest/1183/problem/F 题意: 给你n个数,要你从中选出最多三个数,使得三个数 ... 
- ●BZOJ 3994 [SDOI2015]约数个数和
		题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3994 题解: 莫比乌斯反演 (先定义这样一个符号[x],如果x为true,则[x]=1,否则 ... 
- 聪明的燕姿[JLOI2014]
		题目描述 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌 ... 
- BZOJ1053: [HAOI2007]反素数ant(爆搜)
		Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4163 Solved: 2485[Submit][Status][Discuss] Descript ... 
- 从“n!末尾有多少个0”谈起
		在学习循环控制结构的时候,我们经常会看到这样一道例题或习题.问n!末尾有多少个0?POJ 1401就是这样的一道题. [例1]Factorial (POJ 1401). Description The ... 
- 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 ... 
- hdu1492(约数个数定理)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1492 这里先讲一下约数个数定理: 对于正整数x,将其质因分解为 x = pow(p1, a) * po ... 
- poj 1845 Sumdiv 约数和定理
		Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ... 
- 【搜索】【约数个数定理】[HAOI2007]反素数ant
		对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数. 所以,n以内的反质数即为不超过n的 ... 
随机推荐
- vscode打开SpringBoot项目
			1.使用vscode打开java项目所在文件夹 2.按ctl+~ 打开命令面板 mvn -Dmaven.test.skip=true spring-boot:run 
- 【C语言--数据结构】线性表链式存储结构
			直接贴代码 头文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__ typedef void LinkList; typedef struct _tag_L ... 
- STM32 晶振 系统时钟8MHZ和72Mhz的原因
			首先问题描述: 1.自己画的板子和淘宝买的最小系统板 系统时钟不一致,自己画的是8Mhz,HSE失败:最小系统板72Mhz 2.最小系统板在程序1运行仿真的时候,查看peripherals->P ... 
- Resharper 2019.1.1 破解
			本文链接:https://blog.csdn.net/qq_21361809/article/details/92423949 Resharper ... 
- luogu P1399 [NOI2013]快餐店
			传送门 注意到答案为这个基环树直径\(/2\) 因为是基环树,所以考虑把环拎出来.如果直径不过环上的边,那么可以在环上每个点下挂的子树内\(dfs\)求得.然后如果过环上的边,那么环上的部分也是一条链 ... 
- author认证模块
			author认证模块 用auth模块 你就用全套 不是自己写一部分 用别人一部分  创建超级管理员,用于登录DJango admin的后台管理  命令:createsuperuser,输入顺序用户 ... 
- 3.css3文字与字体
			1.css3文字与字体: ①Font-size:大小. ⑴通常使用px.百分比.em来设置大小: ⑵xx-small.x-small.small.medium.large.x-large.xx-lar ... 
- 动态路由协议RIP
			RIP Routing Information Protocol,属IGP协议,是距离矢量型动态路由协议(直接发送路由信息的协议为距离矢量型协议),使用UDP协议,端口号520. 贝尔曼福特算法 RI ... 
- mysql查询每个直播间每个用户最早进入时间和最晚退出时间
			myself_sql = 'select room_id,source_id user_id,min(cast(at as datetime)) joinroom,max(cast(at as dat ... 
- ffmpeg使用分析视频
			https://www.cnblogs.com/Finley/p/8646711.html 先存下 
