1. 程式人生 > >POJ 3090 Visible Lattice Points | 其實是歐拉函數

POJ 3090 Visible Lattice Points | 其實是歐拉函數

== 歐拉函數 cst name std space 個數 pan 第一個

題目:

給一個n,n的網格,點可以遮擋視線,問從0,0看能看到多少點


題解:

根據對稱性,我們可以把網格按y=x為對稱軸劃分成兩半,求一半的就可以了,可以想到的是應該每種斜率只能看到一個點

因為斜率表達式k=y/x,所以直線上的點都滿足這個關系,那麽顯然當gcd(x,y)==1的時候這個點是直線上的第一個點,其他點的坐標一定是這個點的若幹倍

所以問題轉化成求gcd(x,y)==1的點對個數,即∑phi[i](1<=i<=n)

歐拉函數即可

 1 #include<cstdio>
 2 using namespace std;
 3 int n,t,ans;
 4 int oula(int
n) 5 { 6 int ans=n,a=n; 7 for(int i=2;i*i<=n;i++) 8 { 9 if(a%i==0) 10 { 11 ans-=ans/i; 12 while(a%i==0) 13 a/=i; 14 } 15 } 16 if(a>1) ans-=ans/a; 17 return ans; 18 } 19 int main() 20 { 21 scanf("%d",&t); 22 for (int i=1;i<=t;i++)
23 { 24 ans=0; 25 scanf("%d",&n); 26 for (int j=1;j<=n;j++) 27 ans+=oula(j); 28 printf("%d %d %d\n",i,n,ans*2+1); 29 } 30 return 0; 31 }

POJ 3090 Visible Lattice Points | 其實是歐拉函數