3478题目意思是Farey序列是由一系列不能约分的分数a/b(0<a<b<=n且gcd(a,b)=1)按照递增的顺序组成的,然后给出了Fn的前几项,让你计算Fn中有多少个分数.
很明显Fn中的数的个数就是分别与(2,3,4.....n-1,n)互质的数的个数的和。也就是求欧拉函数的前n项和。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <stack> 5 #include <queue> 6 #include <map> 7 #include <algorithm> 8 #include <vector> 9 10 using namespace std; 11 12 const int maxn = 1000000; 13 14 typedef long long LL; 15 16 LL phi[maxn+1]; 17 18 void init() 19 { 20 LL i,j; 21 for(i=1;i<=maxn;i++) phi[i] = i; 22 for(i=2;i<=maxn;i+=2) phi[i]/=2; 23 for(i=3;i<=maxn;i+=2){ 24 if(phi[i] == i){ 25 for(j=i;j<=maxn;j+=i){ 26 phi[j] = phi[j]/i*(i-1); 27 } 28 } 29 } 30 for(i=3;i<maxn+1;i++){ 31 phi[i]+=phi[i-1]; 32 } 33 } 34 35 int main() 36 { 37 init(); 38 int n; 39 while(cin>>n&&n){ 40 printf("%lld ",phi[n]); 41 } 42 43 return 0; 44 }
3090的情况跟3478差不多,但是要注意的可见点的情况是以x=y这条直线对称的,所以最后的答案是2*phi[n]+1,x=y也算。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <stack> 5 #include <queue> 6 #include <map> 7 #include <algorithm> 8 #include <vector> 9 10 using namespace std; 11 12 const int maxn = 1000; 13 14 typedef long long LL; 15 16 LL phi[maxn+1]; 17 18 void init() 19 { 20 LL i,j; 21 for(i=1;i<=maxn;i++) phi[i] = i; 22 for(i=2;i<=maxn;i+=2) phi[i]/=2; 23 for(i=3;i<=maxn;i+=2){ 24 if(phi[i] == i){ 25 for(j=i;j<=maxn;j+=i){ 26 phi[j] = phi[j]/i*(i-1); 27 } 28 } 29 } 30 for(i=2;i<maxn+1;i++){ 31 phi[i]+=phi[i-1]; 32 } 33 } 34 35 int main() 36 { 37 init(); 38 int n; 39 int cas; 40 cin>>cas; 41 for(int i=1;i<=cas;i++){ 42 cin>>n; 43 printf("%d %d %d ",i,n,2*phi[n]+1); 44 } 45 46 return 0; 47 }