poj 2356 and 3370 鸽巢原理

来源:互联网 发布:银魂中空知大猩猩 编辑:程序博客网 时间:2024/05/17 08:18
题意 : 给你n个整数,取其中的任意个整数满足相加的和是n的倍数


处理出前k个数的sum[k] (1 <= k <= n) 并且对n取余 , 如果有一个sum[k]等于0,自然这个sum就是n的倍数。

根据鸽巢原理,有n个余数 , 余数0 ~ n ,如果没有余数0,至少有两个余数相同,那么这两个sum相减得到的就是n的倍数


POJ2365 code

#include <stdio.h>int a[11111] , sum[11111], vis[11111];int main(){int n,i,j;while(scanf("%d", &n)!=-1){for(i = 1;i <= n; i++){scanf("%d", &a[i]);sum[i] = sum[i-1]+a[i];sum[i] %= n;vis[i] = 0;}for(i = 1;i <= n; i++){if(sum[i]==0){printf("%d\n", i);for(j = 1;j <= i; j++)printf("%d\n", a[j]);break;}else if(vis[sum[i]]){printf("%d\n", i-vis[sum[i]]);for(j = vis[sum[i]]+1;j <= i ;j++)printf("%d\n", a[j]);break;}vis[sum[i]] = i;}}return 0;}

POJ 3370 code

#include <stdio.h>int a[111111] , sum[111111], vis[111111];int main(){int n,i,j,c;while(scanf("%d%d", &c , &n)!=-1 && c){for(i = 1;i <= n; i++){scanf("%d", &a[i]);sum[i] = sum[i-1]+a[i];sum[i] %= c;vis[i] = 0;}for(i = 1;i <= n; i++){if(sum[i]==0){for(j = 1;j < i; j++)printf("%d ", j);printf("%d\n", j);break;}else if(vis[sum[i]]){for(j = vis[sum[i]]+1;j < i ;j++)printf("%d ", j);printf("%d\n", j);break;}vis[sum[i]] = i;}}return 0;}


原创粉丝点击