zoukankan      html  css  js  c++  java
  • 51nod 1103 N的倍数 (抽屉原理)

    题意:一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数。
    例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数。(2 <= N <= 50000,0 < A[i] <= 10^9)
    分析:在modN意义下求A的前缀和,若有为0的前缀和,前k个即为所求;若没有,有抽屉原理,必然存在两个值相等的前缀和,两者相减即为所求.
     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 const int maxn=50005;
     5 int n,a[maxn],Hash[maxn],l,r;
     6 class Tree{
     7 private:
     8     int c[maxn],n;
     9 public:
    10     Tree(int _n){this->n=_n;memset(c,0,sizeof(c));}
    11     void add(int k,int num){
    12         while(k<=this->n){
    13             c[k]=(c[k]+num)%n;
    14             k+=k&-k;
    15         }
    16     }
    17     int read(int k){
    18         int sum=0;
    19         while(k){
    20             sum=(sum+c[k])%n;
    21             k-=k&-k;
    22         }
    23         return sum;
    24     }
    25 };
    26 int main(){
    27     cin>>n;
    28     Tree t(n);
    29     memset(Hash,0,sizeof(Hash));
    30     for(int i=1;i<=n;i++){
    31         cin>>a[i];
    32         t.add(i,a[i]%n);
    33     }
    34     for(int i=1;i<=n;i++){
    35         int k=t.read(i);
    36         if(k==0){
    37             l=1;r=i;break;
    38         }
    39         else if(Hash[k]){
    40             l=Hash[k]+1;r=i;break;
    41         }else{
    42             Hash[k]=i;
    43         }
    44     }
    45     cout<<r-l+1<<endl;
    46     for(int i=l;i<=r;i++){
    47         cout<<a[i]<<endl;
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/7391-KID/p/6877843.html
Copyright © 2011-2022 走看看