经过观察,发现一个规律,n>2时
无视原图第一列第n行,剩下一个(n-1)*(n-1)的矩阵,m=n-1
剩下的图中,1——m列,m到1行,每列、行可见的数量为 <=i 且与 i 互质的数的数量
所以用到 欧拉函数
code:
/**************************************************************
Problem: 2190
Language: C++
Result: Accepted
Time:40 ms
Memory:11028 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int prime[1110000],pr,phi[1110000];
bool v[1110000];
int n;
void getprime()
{
memset( v,true,sizeof v );
pr = 0;
int i,j;
for( i=2;i<=n;i++ )
{
if( v[i] )
{
prime[++pr]=i;
phi[i] = i-1;
}
for( j=1; j<=pr && prime[j]*i<=n; j++ )
{
v[ prime[j]*i ] = false;
if( i%prime[j] == 0 )
{
phi[ i*prime[j] ] = phi[i] * prime[j];
break;
}
else
phi[ i*prime[j] ] = phi[i] * phi[prime[j]];
}
}
}
int main()
{
int i,k;
n=50000;
getprime();
scanf("%d",&n);
if( n==1 )printf("0\n");
else if( n==2 ) printf("1\n");
else
{
n--;
k=3;
for(i=2;i<=n;i++)
k+= 2*phi[i];
printf("%d\n",k);
}
return 0;
}