洛谷P1154 奶牛分厩
题目描述
农夫约翰有N(1<=N<=5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号Si,所有的奶牛都睡在一个有K个厩的谷仓中,厩的编号为0到K-1。每头奶牛都知道自己该睡在哪一个厩中,因为约翰教会了它们做除法,Si MOD K的值就是第i头奶年所睡的厩的编号。
给出一组奶牛的编号,确定最小的K使得没有二头或二头以上的奶牛睡在同一厩中。
输入输出格式
输入格式:
第一行一个正整数N,第2到N+1行每行一个整数表示一头奶牛的编号。
输出格式:
单独一行一个整数表示要求的最小的K,对所有的测试数据这样的K是一定存在的
输入输出样例
输入样例#1:
5 4 6 9 10 13
输出样例#1:
8
说明
Si(1<=Si<=1000000)
复习一波数论咯
——————————————————————————
a mod k=b mod k 等价于k|(a-b)
所以问题变成找出 ai-bj 的所有因数 然后就好辣
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=1e6; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,f[M+7],id[M]; int main() { n=read(); for(int i=1;i<=n;i++) id[i]=read(); sort(id+1,id+1+n); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) f[id[j]-id[i]]=1; for(int i=M;i>=1;i--) for(int j=i*2;j<=M;j+=i) if(f[j]){f[i]=1; break;} for(int i=1;i<=M;i++) if(!f[i]){printf("%d\n",i); return 0;} return 0; }