![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void euler() { for(int i=2;i<maxn;i++){ if(!E[i]) for(int j=i;j<maxn;j+=i){ if(!E[j])E[j]=j; E[j]=E[j]/i*(i-1); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int euler(int n) { int ans=1; for(int i=0; p[i]<=n&&i<k; ++i) { int cnt=0; while(n%p[i]==0) { n/=p[i]; cnt++; } ans*=(cnt+1); } if(n>1)ans*=2; return ans; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void prime() { for(int i=2;i<MAXN;++i) { if(!pri[i])p[k++]=i; for(int j=i<<1;j<MAXN;j+=i) if(!pri[j])pri[j]=1; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 5 using namespace std; 6 7 int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法 8 { 9 if(b==0) 10 { 11 x=1;y=0; 12 return a; //到达递归边界开始向上一层返回 13 } 14 int r=exgcd(b,a%b,x,y); 15 int temp=y; //把x y变成上一层的 16 y=x-(a/b)*y; 17 x=temp; 18 return r; //得到a b的最大公因数 19 }