【题目】
1777: 寻找倍数
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 230 Solved: 135
[Submit][Status][Web Board]
Description
给出n(n<=10000)个正整数,每个数xi<=15000.可以在这个n个数中选择一些数出来,至少选择一个,是否存在一种选择方案使得选择出
来的数的和是n的整数倍
Input
第一行一个T(T<=500),第二行一个数n,接下来n个正整数
Output
Case #x: y,其中x是测试编号,从1开始,y表示答案,如果存在y为Yes,否则为No
Sample Input
2 5 1 2 3 4 1 2 1 2
Sample Output
Case #1: Yes Case #2: Yes
【题解】
抽屉原理。假设n个自然数是a1,a2,a3,…,an,而且考虑如下形式的和:S1=a1,S2=a1+a2,Sn=a1+a2+a3+…+an。
如果在这n个和S1,S2,Sn中,存在一个数是n的倍数,则原命题成立。如果在n个和S1,S2,Sn中,没有n的倍数的数,那么它们被n除所得的余数只可能是1,2,n-1共n-1种情况。但由于S1,S2,Sn共有n个数,从而根据抽屉原理,必然存在两个数它们被n除的余数相同。不妨设在这两个数是Sk与Sj(k>j),那么这两个数的差Sk-Sj一定是n的倍数。
【代码】
#include<stdio.h>
main()
{
int t,n,x;
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&x);
printf("Case #%d: ",k);
if(n==0) printf("No\n");
else printf("Yes\n");
}
}