Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 5881 | Accepted: 2560 | Special Judge |
Description
Input
Output
Sample Input
5 1 2 3 4 1
Sample Output
2 2 3
Source
题目大意:
解题思路:有n个数,找出一个方案满足:从中选出任意多的数字使得它们的和对n求余为0
解题代码:用sum[i]记录前 i 项的和。
(1)如果存在某个sum[i]%n==0 ,那么就已经找到了,就是前i项。
(2)如果不存在,则sum[i]%n的取值范围为1~n-1 那么n项sum必然有 sum[i]%n==sum[j]%n,这时候(sum[j]-sum[i])%n=0,也就是 第i+1项到第j项的和对n求余为0,也满足条件了。
#include <iostream> #include <cstdio> using namespace std; const int maxn=11000; int n,a[maxn],sum[maxn],visited[maxn]; void solve(){ for(int i=1;i<=n;i++){ if(sum[i]%n==0){ printf("%d\n",i); for(int t=1;t<=i;t++){ printf("%d\n",a[t]); } return ; } } for(int i=0;i<=n;i++) visited[i]=-1; for(int i=1;i<=n;i++){ if(visited[sum[i]%n]!=-1){ int t=visited[sum[i]%n]; printf("%d\n",i-t); for(t=t+1;t<=i;t++){ printf("%d\n",a[t]); } }else{ visited[sum[i]%n]=i; } } } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); sum[0]=0; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]; solve(); } return 0; }
POJ 2355 Find a multiple(组合数学-抽屉原理),布布扣,bubuko.com
POJ 2355 Find a multiple(组合数学-抽屉原理)
原文:http://blog.csdn.net/a1061747415/article/details/38265409