【UVA10820】交表

题意

输入n,求有多少个二元组(x,y)满足1<=x,y<=n,且x,y互质。

600组数据,n不超过50001

分析

其实和这个题是一样的qvq

x<y的二元组有f(n)个,那么答案就是2*f(n)+1

根据欧拉函数的定义 f(n)=phi(2)+phi(3)+……+phi(n),把phi(1)=1补进去,就成了2*sum(n)-1,sum为∑phi

这次就换一种求欧拉函数的方法吧,上次是利用欧拉函数的两个性质在线性筛里求的,维护前缀和

第一种是时间复杂度O(N),第二种时间复杂度O(N×logN×logN)

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define N 50050  
  4. int n;  
  5. int phi[N],sum[N];  
  6.   
  7. inline void phis(int n)  
  8. {  
  9.     for(int i=2;i<=n;i++)  
  10.         if(!phi[i])  
  11.             for(int j=i;j<=n;j+=i)  
  12.             {  
  13.                 if(!phi[j])phi[j]=j;  
  14.                 phi[j]=phi[j]/i*(i-1);  
  15.             }     
  16.     for(int i=2;i<=n;i++)sum[i]=sum[i-1]+phi[i];  
  17. }  
  18.   
  19. int main()  
  20. {  
  21.     sum[1]=phi[1]=1;  
  22.     phis(50005);  
  23.     while(scanf("%d",&n)&&n)  
  24.         printf("%d\n",2*sum[n]-1);    
  25. }  
posted @ 2018-10-28 21:28  WJEMail  阅读(125)  评论(0编辑  收藏  举报