1. 程式人生 > 其它 >題解 P2158 【[SDOI2008] 儀仗隊】

題解 P2158 【[SDOI2008] 儀仗隊】

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;
}

End