POJ 3090 欧拉函数递推
题意:为多少个点与原点连线不经过其他点。
首先ans[1]=3,不经过其他点也就是(x,y)点的gcd(x,y)=1,也就是x,y,互素。所以就是每一行上的个数为phi(n)*2因为行和列都算上就是两倍关系。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1000008 long long phi[maxn]; void getphi() { for(int i=1; i<maxn; i++) phi[i]=i; for(int i=2; i<maxn; i+=2) phi[i]>>=1; for(int i=3; i<maxn; i+=2) if(phi[i]==i) { for(int j=i; j<maxn; j+=i) phi[j]=phi[j]/i*(i-1); } phi[1]=3; for(int i=2; i<maxn; i++) phi[i]=phi[i-1]+2*phi[i]; } int main() { getphi(); int n,ca=0,t; scanf("%d",&t); while(t--) scanf("%d",&n), printf("%d %d %lld\n",++ca,n,phi[n]); return 0; }
最后更新:2017-04-03 16:48:45