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

    Description

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

      现在,C君希望你告诉他队伍整齐时能看到的学生人数。

    Input

      共一个数N。

    Output

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

    Sample Input

      4

    Sample Output

      9

    HINT

    【数据规模和约定】   对于 100% 的数据,1 ≤ N ≤ 40000

    题解

    先讲一下18分做法qwq

    当然bzoj是没有部分分的,这是我A了这道题之后专门跑去洛谷测了一下这个想法能捞多少分

    首先观察到,对于每个斜率,一定只有一个人能被看到

    那么直接开一个bool数组,将除了对角线,第一行,第一列的都处理成1(对角线,第一行,第一列的第一个也处理成1)

    然后从左下角开始枚举

    枚举到每个1就根据斜率往上跳,把当前位处理成0

    最后扫一遍这个数组统计1的个数

    然后就会RE一堆

    因为数据范围是n<=40000的,数组都开不了,我当时直接开5000*5000看能捞多少分的

    所以其实这个跟没讲差不多

    #include <cstdio>
    #include <cstring>
    using namespace std;
    bool a[5000][5000];
    int abs(int x){return x<0?-x:x;}
    int main(){
        memset(a,1,sizeof(a));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n-2;i++)a[1][i]=0;
        for(int i=3;i<=n;i++)a[n][i]=0;
        int x=n-1,y=2;
        while(--x&&++y<=n)a[x][y]=0;
        for(int i=n-1;i;i--){
            for(int j=1;j<=n;j++){
                if(i==n-1||j==1||j==2)continue;
                if(!a[i][j])continue;
                int aa=abs(n-i),b=abs(1-j);
                x=i-aa,y=j+b;
                while(x&&y<=n){a[x][y]=0;x=x-aa;y=y+b;}
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(a[i][j])ans++;
            }
        }
        printf("%d
    ",ans-1);
        return 0;
    }
    18分代码

    是时候讲正解了

    其实就是裸的欧拉函数题

    观察到只有对于坐标$(x,y)$,只有当 $ gcd(x,y)=1 $ 时才能被看到,不然它一定会被 $ (1/gcd(x,y),1/(gcd(x,y)) $ 挡住

    而欧拉函数$Eular(n)$表示在1~n中与n互质的数的个数

    所以只需要用欧拉筛求出1~n的Euler值,对他们求个sum就行

    有几个要注意的小坑点是,我们求出来的和只是这个正方形的一半,所以要*2,然后对角线上也有一点,而我们是不会把i==j的情况筛出来的

    所以答案是ans*2+1

    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define N 40040
    int phi[N];
    int main(){
        int n;
        scanf("%d",&n);
        if(n==1)return puts("0"),0;
        phi[1]=1;
        for(int i=2;i<=n;i++){
            if(!phi[i]){
                for(int j=i;j<=n;j+=i){
                    if(!phi[j])phi[j]=j;
                    phi[j]=phi[j]/i*(i-1);
                }
            }
        }
        int ans=0;
        for(int i=1;i<=n-1;i++){
            ans+=phi[i];
        }
        printf("%d
    ",ans*2+1);
        return 0;
    }
  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/henry-1202/p/9354520.html
Copyright © 2011-2022 走看看