思路:枚举a,根据扩展欧几里得算法算出b,之后检查此组a和b是否正确。
#include<iostream>
using namespace std;
typedef long long LL;
const int maxn = 100 + 10;
const int maxv = 10001;
int x[2*maxn], T;
void gcd(LL a, LL b, LL& d, LL& x, LL& y) { //扩展欧几里得辗转相除法
if(!b) { d = a; x = 1; y = 0; }
else { gcd(b, a % b, d, y, x); y -= x*(a/b); }
}
int main() {
cin >> T;
for(int i = 1; i < 2*T; i += 2) cin >> x[i];
for(LL a = 0; a < maxv; a++) {
LL b, k, d, t = x[3] - a*a*x[1]; //决定a, t必须为LL
gcd(a+1, maxv, d, b, k);
if(t % d) continue;
b = b*t/d; //决定b必须为LL
b = (b % maxv + maxv) % maxv; //保证b为正且小于maxv的值
//cout << b << endl;
//cout << a << endl;
bool ok = true;
for(int i = 2; i <= 2*T; i++)
if(i % 2) {
if(x[i] != (a * x[i - 1] + b) % maxv) { //Check
ok = false;
break;
}
} else x[i] = (a * x[i - 1] + b) % maxv; //赋值
if(!ok) continue;
for(int i = 2; i <= 2*T; i += 2) cout << x[i] << endl;
break;
}
return 0;
}