[YZOJ]P3281-小猿刷题-线性筛法优化
来源:互联网 发布:苹果手机导照片到mac 编辑:程序博客网 时间:2024/06/05 22:56
链接
————-题意简述
求 [ L , R ] 之间所有质因子种类数。
————-题解
引理一:
证明:
由引理一,只需证明
由条件
故
由引理一,带入R,可整理得:
则推论一得证。
根据推论一,可以
40分做法:枚举判断每一个数是否为质数,并判断[L,R]中是否有其倍数。若有则答案加一。时间复杂度
70分做法:线性筛法优化40分做法。时间复杂度
100分做法:
发现
这是个很好的性质。如果对[L,R]中的每一个数筛去
这里出现一个问题:如果这些质数出现重复怎么办?
引理二: 若在k为a的倍数,则k+a为a的倍数。
推论二: 若a>R-L+1,质因子a在[L,R]中最多只出现一次。
证明:根据引理二,则若a>R-L+1,a为任意实数,则a的倍数在[L,R]中只出现一次。故推论二得证。
所以最开始筛质数的范围必须定为
#include<cstdio>#include<algorithm>#include<cmath>#define RR register#define dmax(_a,_b)(_a>_b)?(_a):(_b)#define dmin(_a,_b)(_a<_b)?(_a):(_b)using namespace std;int mark[1000100];int prime[2000100];int num[1000100];int main(){ RR int i,j,k,x; RR int L,R,n,len; RR int pt,u,ans; scanf("%d%d",&L,&R); n=dmax((int)sqrt(R),R-L+1)+2; pt=ans=0; for(i=2;i<=n;++i) { if(mark[i]==0)prime[++pt]=i,mark[i]=i,ans+=(R/i>(L-1)/i); for(j=1,u=dmin(n/i,mark[i]);j<=pt&&prime[j]<=u;++j) mark[i*prime[j]]=mark[i]; } len=R-L+1; for(i=1;i<=len;++i)num[i]=i+L-1; for(i=1;i<=pt;++i) { j=prime[i]*((L-1)/prime[i]+1)-L+1; for(;j<=len;j+=prime[i]) while(num[j]%prime[i]==0)num[j]/=prime[i]; } for(i=1;i<=len;++i) if(num[i]!=1) ++ans; printf("%d",ans); return 0;}
- [YZOJ]P3281-小猿刷题-线性筛法优化
- 线性筛优化
- [YZOJ]P3238
- 【优化1】线性优化
- [YZOJ]P3270-t1
- 【 数学基础】【素数线性筛法--欧拉筛法模板】【普通筛法的优化】
- poj 2478 Farey Sequence 线性筛法优化的欧拉函数
- [YZOJ][教训]P3247-文件改名
- [YZOJ]P3290-暴力-性质题
- [YZOJ]P1232-异或游戏
- 线性筛法
- 线性筛法
- 线性素数筛法
- 线性筛法
- 各种线性筛法
- 线性筛素数法
- 线性筛法
- 浅析线性筛法
- 用css实现自定义复选框
- 了解你服务器的心情——top命令详解
- 记录 服装店进销存管理系统 需求分析资料
- ElasticSearch集群搭建及配置监视服务
- 第五周 项目 1
- [YZOJ]P3281-小猿刷题-线性筛法优化
- 美图笔试题;浏览器访问XXX.com的时候发生了什么过程
- 文件系统与磁盘分区
- python 中OS.path函数大全
- BZOJ 1746: [Usaco2005 open]Lazy Cows
- 整合测试报告邮件发送
- 算法(一):排序
- 字节流与字符流的区别详解
- 修仙之路