Find a multiple

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 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3389854.html