Codeforces Round #395 Div.1 C
枚举哪一个点是开始的点和公差就可以了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define ll long long 3 inline void read(int &x) 4 { 5 6 x=0;int k=1;char c=getchar(); 7 while(c<'0'||c>'9'){ 8 if(c=='-')k=-1; 9 c=getchar(); 10 } 11 while(c>='0'&&c<='9'){ 12 x=x*10+c-'0'; 13 c=getchar(); 14 } 15 x*=k; 16 } 17 const int maxn=100000+5; 18 const int inf=1e9+7; 19 using namespace std; 20 int m,n; 21 int num[maxn],tmp[maxn]; 22 ll sum; 23 ll sum_pf; 24 int fp(int a,int k,int m){ 25 int res=1; 26 while(k){ 27 if(k&1) res=1LL*res*a%m; 28 a=1LL*a*a%m; 29 k>>=1; 30 } 31 return res; 32 } 33 int main() 34 { 35 freopen("pacifist.in","r",stdin); 36 freopen("pacifist.out","w",stdout); 37 read(m);read(n); 38 for(register int i=1;i<=n;++i){ 39 read(num[i]); 40 sum=(sum+num[i])%m; 41 sum_pf=(sum_pf+1LL*num[i]*num[i])%m; 42 } 43 if(n==m){printf("0 1\n");return 0;} 44 sort(num+1,num+1+n); 45 for(register int i=2;i<=n;++i){ 46 int d=(num[i]-num[1]+m)%m; 47 int x=1LL*(sum-1LL*n*(n-1)/2%m*d%m+m)%m*fp(n,m-2,m)%m; 48 int ans_pf=1LL*n*x%m*x%m; 49 ans_pf=(ans_pf+1LL*n*(n-1)%m*d%m*x%m)%m; 50 ans_pf=(ans_pf+1LL*n*(n-1)*(2*n-1)/6%m*d%m*d%m)%m; 51 if(ans_pf==sum_pf){ 52 tmp[1]=x; 53 for(register int i=2;i<=n;++i){ 54 tmp[i]=tmp[i-1]+d; 55 tmp[i]%=m; 56 } 57 sort(tmp+1,tmp+1+n); 58 bool flag=1; 59 for(register int i=1;i<=n;++i){ 60 if(num[i]!=tmp[i]){ 61 flag=0; 62 break; 63 } 64 } 65 if(flag==1){ 66 printf("%d %d\n",x,d); 67 return 0; 68 } 69 } 70 } 71 printf("-1\n"); 72 return 0; 73 }