注释掉那段会超时,呃。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int Max=1000000; bool val[Max+1]; int p[350]; int main(){ int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&p[i]); if(n==1){ printf("1 "); continue; } memset(val,false,sizeof(val)); /* for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ int tmp=p[i]-p[j]; // cout<<tmp<<endl; tmp=abs(tmp); // cout<<tmp<<endl; for(int k=1;k<=tmp;k++) if(tmp%k==0) val[k]=true; } } */ for(int i=1;i<=Max;i++){ memset(val,false,i*sizeof(bool)); //这里的i不能少,否则会超时。。。看了DIS才知道的 int j; for(j=0;j<n;j++){ if(!val[p[j]%i]) val[p[j]%i]=true; else break; } if(j==n){ printf("%d ",i); break; } } /* int ans; for(ans=1;ans<Max;ans++) if(!val[ans]) break; printf("%d ",ans);*/ } return 0; }