线性(欧拉)筛
2017-08-04 16:00
127 查看
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 typedef long long ll; 8 const int maxn = 1e6+5; 9 bool flag[maxn]; //标记数组 10 ll phi[maxn]; //欧拉函数值 11 int prime[maxn]; //同时得到素数筛 12 int cnt = 0; 13 void Get_phi(int n) 14 { 15 cnt = 0; 16 memset(flag,true,sizeof(flag)); 17 phi[1] = 1; 18 for(int i=2;i<=n;i++) 19 { 20 if(flag[i]) //素数 21 { 22 prime[cnt++] = i; 23 phi[i] = i-1; //素数的欧拉函数值是i-1 24 } 25 for(int j=0;j<cnt;j++) 26 { 27 if(i*prime[j]>n) 28 { 29 break; 30 } 31 flag[i*prime[j]] = false;//素数的倍数不是素数 32 if(i%prime[j]==0) //i%mod prime = 0,那么phi(i*p) = p*phi(i) 33 { 34 phi[i*prime[j]] = prime[j]*phi[i]; 35 break; 36 } 37 else phi[i*prime[j]] = (prime[j]-1)*phi[i];//i mod prime != 0, 那么 phi(i * prime) == phi(i) * (prime-1) 38 } 39 } 40 } 41 ll sum[maxn]; 42 int main() 43 { 44 Get_phi(1e6); 45 for(int i=2;i<=1000;i++) 46 { 47 sum[i] = sum[i-1]+phi[i]; 48 // cout<<sum[i]<<endl; 49 } 50 int n; 51 while(cin>>n) 52 { 53 if(n==0) break; 54 cout<<sum <<endl; 55 } 56 return 0; 57 }
相关文章推荐
- [Ahoi2005]COMMON 约数研究 【欧拉线性筛的应用】
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
- BZOJ 2818 Gcd 线性欧拉
- 欧拉线性筛法求素数(顺便实现欧拉函数的求值)
- BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)
- BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛
- 【欧拉筛/线性筛】BZOJ2813 奇妙的Fibonacci
- 线性筛法(欧拉筛法)
- 线性筛(欧拉筛法)简介(洛谷P3383)
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
- 欧拉线性筛
- 线性求区间欧拉函数(顺便线性求区间内所有素数)(类似欧拉线性素数筛)
- UVA11426 FZU1969 51NOD1188 线性欧拉筛法+筛法
- 线性筛选素数(欧拉筛选)
- 欧拉线性筛模板
- 欧拉线性筛求质数
- 欧拉线性筛&欧拉函数&莫比乌斯函数
- 欧拉线性筛质数(线性)
- 欧拉线性筛法求素数 学习报告
- 【数论】(贾志鹏)线性欧拉筛模板&&CODE[VS] 1453 统计素数个数2