原题
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的生后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C 君希望你告诉他队伍整齐时能看到的学生人数。
1<=n<=40000
概要
依图
思路
依图发现:能被看到的点(a,b),中,$\gcd(a-1,b-1)=1$
所以,要求的便是1至n-1中,互质的数对数+3(图中上和右两个,并不满足该规律,因为a和b分别为1,而不选右上点是方便计数,因为会重复)
$O(n^2)$不可行,考虑欧拉函数的意义,发现就是$3+2*\sum_{i=1}^{n}\varphi(i)$
欧拉函数用欧拉筛$O(n)$求
实现部分
#include<cstdio>
using namespace std;
int n,ans;
int prime[40001],len,bz[40001],f[40001];
int main(){
scanf("%d",&n);
for(int i=2;i<=40000;i++){
if(bz[i]==0){
prime[++len]=i;
f[i]=i-1;
}
for(int j=1;j<=len&&prime[j]*i<=40000;j++){
bz[prime[j]*i]=1;
if(i%prime[j]==0){
f[prime[j]*i]=f[i]*prime[j];
break;
}
else{
f[prime[j]*i]=f[i]*(prime[j]-1);
}
}
}
for(int i=1;i<n;i++){
ans+=f[i];
}
ans*=2;
ans+=3;
printf("%d",ans);
}
标签:prime,3rd,仪仗队,int,40001,2022,ans,SDOI2008,欧拉 From: https://www.cnblogs.com/tlz-place/p/16723931.html