思路:枚举 a ,通过扩展欧几里得算法利用数列前两个值求 b ,排除非整数解的情况,判断该组 a,b 是否满足剩余序列,(注意必须判断整个序列,不能只判断前几个值,时间够用)。注意对于求出的 b 要模10001。(观察通解和b范围的关系)
1 #include <cstdio> 2 using namespace std; 3 4 void exgcd(int a,int b,int & d,int & x,int & y){ 5 if (b==0) {x=1;y=0;d=a;return;} 6 exgcd(b,a%b,d,y,x); 7 y-=x*(a/b); 8 } 9 10 int main(){ 11 12 int n,h[10005],a,d,b,l; 13 scanf("%d",&n); 14 for(int i=1;i<=n;i++) 15 scanf("%d",&h[i]); 16 17 for(a=0;a<10001;a++){ 18 19 exgcd(a+1,10001,d,b,l); 20 long long c=h[2]-(long long)a*a*h[1]; 21 b=(b*c/d)%10001; 22 if (c%d) continue; 23 int f=1; 24 for (int i=1;i<n;i++){ 25 int temp=(((a*h[i]+b)%10001)*a+b)%10001; 26 if (temp!=h[i+1]){ 27 f=0; 28 break; 29 } 30 } 31 if (f) { 32 for (int i=1;i<=n;i++) 33 printf("%d\n",(a*h[i]+b)%10001); 34 return 0; 35 } 36 } 37 }