BZOJ2818 Gcd 素数筛+欧拉筛
来源:互联网 发布:林书豪 数据 编辑:程序博客网 时间:2024/05/19 12:17
题目描述:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
1<=N<=10^7
爆搜?死!那怎么办?
我们注意到,Gcd(x,y)=p,那么就有Gcd(x/p,y/p)=1!
于是我们枚举每个p,设F[i]为i以内互质数对的个数
那么F[i]是啥?没错,phi[i]的前缀和!
于是我们用素数筛+欧拉筛算出n以内所有的质数和所有数的欧拉函数,那么就有ans=sigma( F[ N / prime[i] ] )
写完发现连样例都没过。。这时候才发现数对是有序的
于是Neoans=ans*2-cnt
其中cnt是n以内素数的个数
#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n;int prime[700000],top;bool not_prime[10001000];long long ans,phi[10001000];void Linear_Shaker(){int i,j;phi[1]=1;for(i=2;i<=n;i++){if(!not_prime[i]){ prime[++top]=i;phi[i]=i-1;}for(j=1;j<=top&&i*prime[j]<=n;j++){not_prime[prime[j]*i]=1;if(i%prime[j]==0){phi[prime[j]*i]=phi[i]*prime[j];break;}phi[prime[j]*i]=phi[i]*(prime[j]-1);}}}int main(){int i;cin>>n;Linear_Shaker();for(i=1;i<=n;i++)phi[i]+=phi[i-1];for(i=1;i<=top;i++)ans+=phi[ n/prime[i] ];cout<<ans*2-top<<endl;}
1 0
- BZOJ2818 Gcd 素数筛+欧拉筛
- 【bzoj2818】Gcd 线性筛法
- 【BZOJ2818】Gcd
- [BZOJ2818] Gcd
- [BZOJ2818]Gcd
- bzoj2818 Gcd
- [BZOJ2818]Gcd
- [bzoj2818]gcd
- [bzoj2818]gcd
- 【bzoj2818】Gcd
- BZOJ2818: Gcd
- bzoj2818 Gcd
- 【bzoj2818】Gcd
- bzoj2818: Gcd
- bzoj2818 Gcd
- BZOJ2818: Gcd
- BZOJ2818 Gcd
- 【BZOJ2818】Gcd,数论练习之欧拉筛
- 【教程】如何申请Chrome应用商店(Web Store)开发者
- Struts2多文件上传例子
- 一幅画
- HDU 1258 Sum it up 搜索DFS
- MATLAB中的字符串
- BZOJ2818 Gcd 素数筛+欧拉筛
- HLSL基础练习
- 黑马程序员—2014史上最难就业年,争做“大波”幸运儿
- [WARALD美国职业谈] 读了博士PHD有什么出路?
- 乱码是怎样形成的?编码和解码的规则
- 在XP上安装VS2002
- 黑马程序员----键盘录入,以over为结束(黑马视频)
- 黑马程序员—[JavaEE就业薪资] JavaEE+云计算5期,就业率98.46%,平均薪水7011元!
- Shift_JIS≒CP932=MS932=Windows-31J