来源:http://poj.org/problem?id=3370
题意:n个小孩给m个邻居要糖,要求是糖的总数是n的倍数,问应该向哪些邻居要。
思路:鸽巢原理的题,组合数学课本上的题目,上午刚写了道基本上一模一样的。。
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
typedef long long ll;
const int N = 100010;
int flag[N],pos[N],num[N];
ll sum[N];
int main(){
freopen("1.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)){
if(n + m == 0)
break;
CLR(sum,0);
CLR(flag,0);
CLR(num,0);
CLR(pos,-1);
for(int i = 1; i <= m; ++i){
scanf("%d",&num[i]);
sum[i] = sum[i-1] + num[i];
}
for(int i = 1; i <= m; ++i){
int x = sum[i] % n;
if(flag[x]){
int y = pos[x];
for(int j = y+1; j <= i; ++j)
printf("%d ",j);
printf("\n");
break;
}
if(x == 0){
for(int j = 1;j <= i; ++j)
printf("%d ",j);
printf("\n");
break;
}
flag[x] = 1;
pos[x] = i;
}
}
return 0;
}