约数定理(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的 ...
随机推荐
- 关于win10系统如何调用debug查看CPU汇编指令和内存
下载安装DOSBox.网上提供下载地址:DOSBOX Debug是DOS(Disk Operating System,磁盘操作系统).windows提供的实模式(8086方式)程序的调试工具.使用它, ...
- House_Of_Spirit ctf oreo程序分析
oreo程序下载 提取码:t4xx 程序分析 int __cdecl main() { leave_add = 0; leave_del = 0; leave_buf = (char *)&u ...
- Java多线程学习——任务定时调度
Timer 本身就是一个线程,最主要的方法就是schedule(). schedule()的参数介绍: schedule(TimerTask task, long delay) //延迟delay毫秒 ...
- iptables添加开放端口
查看状态 iptables -L -n 编辑/etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 4000 -j ACCEPT 重启 servi ...
- docker--docker 容器操作
6 docker 容器操作 容器是 docker 镜像的运行时实例. 6.1 创建容器 docker run [options] image command [ARG...]options选项: ‐i ...
- [转帖]PostgreSQL ident和peer基于操作系统用户的认证
PostgreSQL ident和peer基于操作系统用户的认证 https://yq.aliyun.com/articles/55898 其实 local和127. 还是有区别的 这里面应该就是对应 ...
- Mybatis—动态sql拼接问题
背景:使用Mybatis的最近半年,经常发现一些小坑,现在总结回顾下,记个小本本,不让它再来欺负我! 百度了许久,才留心到官网文档,比我的全,我很菜的! *************<if> ...
- 取石子游戏 HDU 1527 博弈论 威佐夫博弈
取石子游戏 HDU 1527 博弈论 威佐夫博弈 题意 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两 ...
- [LeetCode] 140. 单词拆分 II
题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...
- Redis---键的过期时间及数据淘汰策略
5.键的过期时间 Redis可以为每个键设置过期时间,当键过期时,会自动删除该键. 对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间. 6.数据 ...