题目传送门:https://www.luogu.org/problemnew/show/P2158
题意:
如图,有一个n*n的矩阵,求在(1,1)的左下方能看到多少个人。
思路:
显然分成两部分:
结果就为2~n行的结果*2+1。
考虑如何求解2~n行的结果,实际上我们发现结果就为(本质上就是求gcd(i,j)=1的ij的个数,此时(1,1)的坐标就变为(0,0))。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,t=0,ans=0;
int phi[40010],prime[40010];
void init(int ma)
{
phi[1]=1;
for(int i=2;i<=ma;i++)
{
if(!phi[i])
{
prime[++t]=i;
phi[i]=i-1;
}
for(int j=1;j<=t&&i*prime[j]<=ma;j++)
{
if(!(i%prime[j]))
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
scanf("%d",&n);
init(n);
for(int i=1;i<n;i++)
ans+=phi[i];
printf("%d",!ans?0:(ans<<1)+1);
}