您的位置:首页 > 其它

POJ 2356 Find a multiple 鸽巢原理

2012-11-21 12:28 405 查看
Find a multiple

记sum[i] = (sum[i-1] + num[i])%N,显然对于sum[1...N]肯定会分布在0....N-1中,如果出现sum[i] = 0,显然我们已经找到了一组解;如果没有出现,也就是说sum[1...N]的值都分布在1....N-1中,N个数分布在1....N-1中,显然会出现sum[i] = sum[j], 其中i != j;这样我们就可以找到一组解。

#include <cstdio>
#include <cstring>
const int maxn = 10005;

int s[maxn];
int app[maxn];
int number[maxn];

int main(){
int n, i, flag = 0, begin, end;
scanf("%d", &n);
for(i = 1; i <= n; i ++){
int a;
scanf("%d", &a);
number[i] = a;
s[i] = (s[i-1] + a)%n;
if(s[i]==0){
begin = 1;
end = i;
break;
}
//这里不需要保存出现几次,只要保存这个值最先出现的下标
//当再次取模到这个点的时候,我们就直接找到了一组解
if(app[s[i]]==0){
app[s[i]] = i;
}
else{
begin = app[s[i]] + 1;
end = i;
break;
}
}
printf("%d\n", end - begin + 1);
while(begin <= end){
printf("%d\n", number[begin++]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: