poj2356:http://poj.org/problem?id=2356
题意:给定n个数,从中选出连续的若干个,使得和为n的倍数。多解时输出任意解。
分析:设sum[0]=0,sum[i]表示数列中第1~i个数的和对n取余的结果。那么现在有sum[0~n],n + 1个整数,分布在区间 [0, n-1]上的n个整数点上,则至少有两个数会分布在同一个整数点,即存在sum[i]==sum[j]且i!=j。这样以来第i+1~j个数即为 所求。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 int s[10003], a[10003]; 7 int start,end,n; 8 bool flag; 9 int main(){ 10 while(~scanf("%d",&n)){ 11 flag=false;s[0]=0; 12 for(int i=1;i<=n;i++){ 13 scanf("%d",&a[i]); 14 s[i]=(s[i-1]+a[i])%n; 15 } 16 for(int i=1;i<=n;i++){ 17 if(s[i]==0){ 18 flag=true;end=i;start=0; 19 break; 20 } 21 for(int j=i+1;j<=n;j++){ 22 if(s[i]==s[j]){ 23 flag=true;start=i;end=j; 24 break; 25 } 26 } 27 if(flag)break; 28 } 29 if(flag){ 30 printf("%d ",end-start); 31 for(int i=start+1;i<=end;i++) 32 printf("%d ",a[i]); 33 } 34 else 35 printf("0 "); 36 } 37 }