您的位置:首页 > 其它

poj3370 poj2356 鸽巢定理

2013-11-18 16:02 183 查看
解梯报告

题目链接 :http://poj.org/problem?id=3370

题目大意 :给你n个数,找出其中c个数满足c个数的和是c的倍数。(c
<=n)

思路 :余数计算 + 鸽巢定理。

取余是一种常用手段,尤其是当题目中找一些数字直接和的关系的时候,往往通过

余数来将数字分类。2011年多校FZU有一位dp的题目就可以用余数乱搞。

将前i个数的和模c的值存下来,如果sum[i]
= 0或sum[i]之前第k位出现过,那么

Sum[i]
– sum[k] = 0,即k+1到i是满足模c余零的。到这里还没有用到鸽巢定理,题

目描述里有无解的情况,而一个重要的信息(c<=n)告诉我们这里是必然有解的。
余数有c个(0到c)要放到n个盒子里(n>=c)那么必然有一个是0或者有两个是
一样的。《鸽巢定理》



AC code:

#include<cstdio>

#include<cstring>

#defineMAXN100100

intnum[MAXN],sum[MAXN],vis[MAXN];

voidprint(inta,intb){

for(inti=a;i<=b;++i)printf("%d
",i);

printf("\n");

}

intmain(){

intc,n;

while(~scanf("%d
%d",&c,&n),c||n){

for(inti=1;i<=n;i++){

scanf("%d",&num[i]);

}

memset(vis,0,sizeof(vis));

sum[0]=0;

for(inti=1;i<=n;++i){

sum[i]=(sum[i-1]+num[i])%c;

if(sum[i]==0){

print(1,i);

break;

}

if(vis[sum[i]]){

print(vis[sum[i]]+1,i);

break;

}

vis[sum[i]]=i;

}

}

return0;

}



poj2356 鸽巢定理" TITLE="poj3370 poj2356 鸽巢定理" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: