1. 程式人生 > >[SDOI2008]儀仗隊

[SDOI2008]儀仗隊

pre cstring ++ 歐拉 spa bzoj += int logs

OJ題號:

BZOJ2190、洛谷2158

思路:

歐拉$\varphi$函數的應用。
經過觀察可發現,可以被觀察到的點,其坐標$(x,y)$中$x$和$y$必定互質。
那麽,除去左邊第一列、下邊最後一行的點,左上角、右下角總共能看到的點數是$\displaystyle{\sum_{1\leq i<n}}\varphi(i)$。
用一種類似於素數篩的方法即可求出所有的歐拉$\varphi$函數值。
註意最後對角線會重復算,需要減去一次,並加上左邊第一列、下邊最後一行共兩次,最後答案是$ans\times 2+1$。

 1 #include<cstdio>
 2
#include<cstring> 3 int main() { 4 int n; 5 scanf("%d",&n); 6 int phi[n]; 7 memset(phi,0,sizeof phi); 8 int ans=phi[1]=1; 9 for(int i=2;i<n;i++) { 10 if(!phi[i]) { 11 for(int j=i;j<n;j+=i) { 12 if(!phi[j]) {
13 phi[j]=j; 14 } 15 phi[j]=phi[j]/i*(i-1); 16 } 17 } 18 ans+=phi[i]; 19 } 20 printf("%d\n",ans<<1|1); 21 return 0; 22 }

[SDOI2008]儀仗隊