題解 P2158 【[SDOI2008] 儀仗隊】
阿新 • • 發佈:2021-08-22
P2158 [SDOI2008] 儀仗隊
題目大意:
solution:
先得出結論:當 \(\gcd(x,y)=1\) 時兩個點不可見,換句話說,就是兩個點互質(0,1特殊考慮)。
簡單證明:
反證法:
設 \(x,y\) 所在直線斜率為 \(k=\frac{y}{x}\) \(\gcd(x,y)=d\) ,假設 \(x,y\) 不互質,設 \(x'=x/d,y'=y/d\) ,易證 \(\frac{y'}{x'}\) 也是等於 \(k\) 的,所以假設不成立。 \(x,y\) 互質。
證畢。
問題就轉化為求 \(\sum ^n _{i=1} \varphi(n)\) ,不過還得一些處理。
細節處理:
- 想好多算或者少算的地方。
程式碼
#include<cstdio> using namespace std; const int N=1005; int phi[N],pr[N],cnt; int pre[N]; inline void xxs(){ phi[1]=1; for(int i=2;i<=1000;i++){ if(!phi[i]) pr[++cnt]=i,phi[i]=i-1; for(int j=1;j<=cnt;j++){ if(i*pr[j]>1000) break; if(i%pr[j]==0) phi[i*pr[j]]=phi[i]*pr[j]; else phi[i*pr[j]]=phi[i]*(pr[j]-1); } } for(int i=1;i<=1000;i++) pre[i]=pre[i-1]+phi[i]; } int main(){ xxs(); int T,t=0; scanf("%d",&T); while(T--){ ++t; int n; scanf("%d",&n); printf("%d %d %d\n",t,n,pre[n]*2+1); } return 0; }