题解 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

上一篇:AcWing算法提高课数学部分


下一篇:浅谈欧拉函数