• hdu5776sum


    题目连接

     抽屉原理:如果现在有3个苹果,放进2个抽屉,那么至少有一个抽屉里面会有两个苹果

    抽屉原理的运用

    现在假设有一个正整数序列a1,a2,a3,a4.....an,试证明我们一定能够找到一段连续的序列和,让这个和是n的倍数,该命题的证明就用到了抽屉原理

    我们可以先构造一个序列si=a1+a2+...ai

    然后分别对于si取模,如果其中有一个sk%n==0,那么a1+a2+...+ak就一定是n的倍数(该种情况得证)

    下面是上一种情况的反面,即任何一个sk对于n的余数都不为0

    对于这种情况,我们可以如下考虑,因为si%n!=0

    那么si%n的范围必然在1——(n-1),所以原序列si就产生了n个范围在1——(n-1)的余数,于是抽屉原理就来了,n个数放进n-1个盒子里面,必然至少有两个余数会重复,那么这两个sk1,sk2之差必然是n的倍数,

    而sk1-sk2是一段连续的序列,那么原命题就得到了证明了

    实现代码如下

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 using namespace std;
     6 int sum[500000],vis[500000];
     7 int main()
     8 {
     9     int n,m,t,i,j,flag,a;
    10     scanf("%d",&t);
    11     while(t--)
    12     {
    13         memset(vis,0,sizeof(vis));
    14         memset(sum,0,sizeof(sum));
    15         vis[0]=1;flag=0;
    16         scanf("%d%d",&n,&m);
    17         for(i=1;i<=n;i++)
    18         {
    19             scanf("%d",&a);
    20             sum[i]+=(sum[i-1]+a)%m;
    21             if(vis[sum[i]]){flag=1;}
    22             else vis[sum[i]]=1;
    23         }
    24         if(flag)
    25         printf("YES
    ");
    26         else printf("NO
    ");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    ajax优缺点
    关于测量专业软件使用感受及建议
    12.7
    12.6
    场景调研
    对搜狗输入法的看法及建议
    12.9
    12.8
    12.5站立会议
    12.4站立会议
  • 原文地址:https://www.cnblogs.com/WHLdbk/p/6360348.html
Copyright © 2020-2023  润新知