基本思想:
不被挡住的条件是(x,y)中的x,y互质,例如A(4,2)会被挡住,会被B(2,1)挡住,B*2=A;
先确定n-1层,再确定第n层;
整个图像关于对角线对称,所以可以只考虑一半的情况,然后*2;
对于第3行,上三角形,确定x,y是否互质就是确定3的欧拉函数值是多少。
#include <stdio.h>
__int64 oulahs[1001];
int prime(int x)
{
int i;
if(1==x)
{
return 0;
}
for(i=2;i*i<=x;i++)
{
if(!(x%i))
{
return 0;
}
}
return 1;
}
void oula(void)//求欧拉函数
{
int i,ans,m,j;
oulahs[1]=1;
for(i=2;i<1001;i++)
{
ans=i;
if(prime(i))
{
ans=ans-ans/i;
oulahs[i]=ans;
continue;
}
for(j=2;j*j<=i;j++)
{
if(i%j==0)
{
m=i/j;
if(prime(j))
{
ans=ans-ans/j;
}
if(m!=j&&prime(m))
{
ans=ans-ans/m;
}
}
}
oulahs[i]=ans;
}
}
int main()
{
int n,i,m,j;
oula();
oulahs[1]=3;
for(i=2;i<1001;i++)
{
oulahs[i]=oulahs[i-1]+oulahs[i]*2;//由n-1层递推到n层
}
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&m);
printf("%d %d %I64d\n",i,m,oulahs[m]);
}
return 0;
}