题意
输入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)
代码
- #include<bits/stdc++.h>
- using namespace std;
- #define N 50050
- int n;
- int phi[N],sum[N];
- inline void phis(int n)
- {
- for(int i=2;i<=n;i++)
- if(!phi[i])
- for(int j=i;j<=n;j+=i)
- {
- if(!phi[j])phi[j]=j;
- phi[j]=phi[j]/i*(i-1);
- }
- for(int i=2;i<=n;i++)sum[i]=sum[i-1]+phi[i];
- }
- int main()
- {
- sum[1]=phi[1]=1;
- phis(50005);
- while(scanf("%d",&n)&&n)
- printf("%d ",2*sum[n]-1);
- }