Codeforces Round #395 Div.1 C

枚举哪一个点是开始的点和公差就可以了。

 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 }
View Code

 

posted @ 2017-11-04 19:16  Chenyuanyang0001  阅读(72)  评论(0编辑  收藏  举报