题目链接:http://poj.org/problem?id=2769
题目大意:T.Chur在大学里教授不同群体的学生,每个学生都有一个独特的学生证号码SIN(0到10^6范围内的整数).T.Chur希望在每个分组内找到最小的整数m,使得该组内的所有SIN对m取余的值都不同。
分析:从0开始枚举每一个整数i作为m的值,分别判断分组内有没有两个数对m取余相同即可。可以用一个数组p标记已经出现过的余数。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define maxn 100005
int a[maxn];
bool p[maxn];
int main()
{
int t,n,ans;
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=1;i<maxn;i++)
{
memset(p,0,sizeof(p));
bool flag=true;
for(int j=0;j<n;j++)
if(p[ a[j]%i ])
{
flag=false;
break;
}
else p[ a[j]%i ]=1;
if(flag)
{
ans=i;
break;
}
}
printf("%d\n",ans);
}
return 0;
}