约数定理(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的 ...
随机推荐
- Servlet生命周期 Servlet获取配置信息 ServletContext
一.Servlet生命周期 实例化 ——> 初始化 ——> 服务 ——> 销毁 出生:(实例化 然后 初始化)tomcat第一次访问,Servlet就出生(默认情况下) 活着:( ...
- MACBOOK蓝牙连接丢失恢复
MACBOOK用户可能会碰到一个神奇而无奈的问题: 某些情况下,很多时候从睡眠状态回来,会发现蓝牙设备再也无法连接,包括蓝牙鼠标.键盘等等... 恢复方法一般是,重启或注销后重新登陆,然后所有工作现场 ...
- 【HBase】二、HBase实现原理及系统架构
整个Hadoop生态中大量使用了master-slave的主从式架构,如同HDFS中的namenode和datanode,MapReduce中的JobTracker和TaskTracker,YAR ...
- selenium:css_selector定位详解(css selector和xpath的比较)
selenium使用css selector和xpath的比较 selenium提供的定位方式(常用) ID NAME CLASS CSS SELECTOR XPATH 推荐的定位方式的优先级 优 ...
- python+selenium下弹窗alter对象处理01
alt.accept() : 等同于单击“确认”或者“OK” alt.dismiss() : ...
- k线图的分形
蜡烛图上的分形指标,作为一种特殊的K线组合形态,通过对价格的一系列的高低点的描述,辅助识别出市场潜在的突破和反转点,预判后期走势. 顶分形:相邻的五根K线,若中间那根K线最高价为这五根K线的最高价,则 ...
- 管道(Pipe)----计算机进程间通信
参至他人博客:https://blog.csdn.net/u011583316/article/details/83419805
- 【已解决】Error running 'xxx项目' Command line is too long(idea版)
[错误] Error running 'xxx项目': Command line is too long. Shorten command line for xxx or also for Sprin ...
- JavaScript的循环结构和经典题目
一.JS中的循环结构 循环结构的执行步骤1.声明循环变量:2.判断循环条件;3.执行循环体操作:4.更新循环变量:5.然后循环执行2-4,直到条件不成立,跳出循环. while循环()中的表达式,运算 ...
- Java多线程(1)
线程与进程 进程:程序的执行过程 线程:线程共享进程的资源 Java多线程 实现的方式 继承Tread类:使用getName()获取当前线程名 实现Runnable接口:Thread.currentT ...