poj 3090 Visible Lattice Points

来源:互联网 发布:淘宝采集宝贝 编辑:程序博客网 时间:2024/04/29 04:57

 基本思想:

不被挡住的条件是(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;
}

原创粉丝点击