Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
HINT
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
Source
数论
我刚发现自己之前竟然没做过这个题…
答案是
2∗∑i=1n−1phi(i) +1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 100010
using namespace std;
bool not_prime[MAXN];
int prime[MAXN],num;
int phi[MAXN];
long long pre[MAXN],ans;
int n;
void check_prime()
{
for (int i=2;i<=50000;i++)
{
if (!not_prime[i]) prime[++num]=i,phi[i]=i-1;
for (int j=1;j<=num&&i*prime[j]<=50000;j++)
{
not_prime[i*prime[j]]=1;
if (i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
phi[1]=1;
check_prime();
scanf("%d",&n);
for (int i=1;i<=n;i++) pre[i]=pre[i-1]+phi[i];
ans=2*pre[n-1]+1;
cout<<ans<<endl;
}