zoukankan      html  css  js  c++  java
  • bzoj2190 仪仗队

    传送门

    题目

    作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图),现在,C君希望你告诉他队伍整齐时能看到的学生人数。

    Input共一个数N。

    Output共一个数,即C君应看到的学生人数。

    分析

    我们发现对于点(x,y)当且仅当gcd(x,y)=1时这个点才可以被看到,这不由让我们想起了欧拉函数.

    我们将矩形按对角线分成两半,所以不难看出最后的答案即为:

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<queue>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int phi[500000],prime[500000],is[500000],cnt;
    int main(){
          int n,m,i,j,k;
          cin>>n;
          if(n==1){printf("0");return 0;}
          phi[1]=1;
          for(i=2;i<=n;i++){
            if(!is[i]){
                prime[++cnt]=i;
                phi[i]=i-1;
            }
            for(j=1;j<=cnt&&i*prime[j]<=n;++j){
                is[i*prime[j]]=1;
                if(i%prime[j]==0){
                    phi[i*prime[j]]=phi[i]*prime[j];break;
                }
                else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
        //for(int i=1;i<=n;++i)printf("%d %d
    ",i,phi[i]);
        int ans=0;
        for(i=1;i<n;i++)ans+=phi[i];
        cout<<ans*2+1<<endl;
        return 0;
    }
  • 相关阅读:
    uinty之碰撞体,触碰体,刚体
    背景图片的设置和定位等
    margin padding
    《大道至简》之懒人的‘懒’
    灭霸—个人冲刺2(1)
    软件工程—个人作业(7.2)
    软件工程—个人作业(7.1)
    学习进度(13)
    学习进度(12)
    人月神话阅读笔记02
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9205545.html
Copyright © 2011-2022 走看看