题目简化:给定n,求满足i,j∈[2,n]且gcd(i,j)=1的数对(i,j)的个数(1≤n≤40000).
解法:只需求i>j时满足条件的数对(i,j)的个数,然后再将最终结果乘2即可,那么枚举i,对于每个i求ϕ(i)即可
没用筛法求欧拉函数也过了…
AC code:
#include <cstdio>
const int N=40010;
int n,ans=1;
int fi[N];
int power(int x,int y){
if(!y) return 1;
int t=power(x,y>>1);
t*=t;
if(y&1) t*=x;
return t;
}
int main(){
scanf("%d",&n);
if(n==1){
printf("0\n");
return 0;
}
for(int i=1;i<n;i++) fi[i]=1;
for(int i=1;i<n;i++){
int t=i;
for(int j=2;j*j<=i;j++){
int cnt=0;
while(!(t%j)){
t/=j;cnt++;
}
if(cnt) fi[i]*=power(j,cnt-1)*(j-1);
}
if(t!=1) fi[i]*=t-1;
}
for(int i=1;i<n;i++) ans+=fi[i]<<1;
printf("%d\n",ans);
return 0;
}