Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
HINT
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
竟然发现这个题没写题解……赶紧来补一发、
很容易看出条件是gcd(x,y)=1,那么(x,y)可以被看到。
如何统计这个呢。。这个矩阵实际上是对称的,
假设枚举了x,那么每次求出几个y和它互质即可,
那么同理y的情况是一样的,答案要*2.
最后别忘了特殊的3个点。
#include<cstdio>
#include<algorithm>
#define ll long long
#define TY 1000000007
using namespace std;
int lenty,prime[5000];
bool zcr[40005];
ll a,b,phi[40005];
int main(){
lenty=0;
for (int i=2;i<=40000;i++){
if (!zcr[i]) phi[i]=i-1,prime[++lenty]=i;
for (int j=1;j<=lenty && i*prime[j]<=40000;j++){
zcr[i*prime[j]]=1;
if (i%prime[j]==0) phi[i*prime[j]]=phi[i]*prime[j];
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
scanf("%lld",&a);
if (a==1) return puts("0"),0;
phi[0]=(ll)0;
for (int i=1;i<=40000;i++)
phi[i]=phi[i-1]+phi[i];
ll tyans=phi[a-1]*2+3;
printf("%lld\n",tyans);
return 0;
}