bzoj 2190 [SDOI2008]仪仗队(欧拉函数)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=2190
【题意】
n*n的正方形,在(0,0)格点可以看到的格子数目。
【思路】
预处理出欧拉函数。
(x,y)=1,1<=y<=n,x<y的数对为t=sigma{ phi(i) } 1<=i<=n,则答案为2*t+1。
当然也可以用莫比乌斯反演求,懒得写了 (〜 ̄△ ̄)〜
【代码】
1 #include<cmath> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 6 const int N = 5e4+10; 7 8 int n; 9 int phi[N]; 10 11 void get_phi(int n) 12 { 13 phi[1]=1; 14 for(int i=2;i<=n;i++) if(!phi[i]) 15 { 16 for(int j=i;j<=n;j+=i) 17 { 18 if(!phi[j]) phi[j]=j; 19 phi[j]=phi[j]/i*(i-1); 20 } 21 } 22 } 23 24 int main() 25 { 26 scanf("%d",&n); 27 get_phi(n); 28 int ans=0; 29 for(int i=1;i<n;i++) ans+=phi[i]; 30 printf("%d",ans*2+1); 31 return 0; 32 }
posted on 2016-04-02 17:23 hahalidaxin 阅读(309) 评论(0) 编辑 收藏 举报