2中方法.
第一种是暴力, 枚举1~10000的a,b; 即2个for循环+判断for循环
第二种是欧几里得
欧几里得法:
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 10001;
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 = y - x*(a/b);
}
}
int main(){
int T;
ll V[205];
cin>>T;
for(int i = 1; i<=2*T; i+=2)
{
cin >> V[i];
}
for(ll a = 0; a<=10000 ; a++){
ll l, d, b, c;
l = (V[3]-a*a*V[1]);
gcd(maxn, a+1, d, c, b);
// 因为d是最大公约数 而l是左边的常数
// v[3]-a*a*v[1] = b(a+1) - 10001*k;
// 两边要等价 需要l是d的倍数;
if(l%d) continue;
b = b*l/d; // b扩大l/d倍, 因为这样才等价(两边)
// eg: d = 1; 1 = -1*5 + 1*6;
// l = 2; 2 = -1*2*5 + 1*2*6;
bool ok = true;
for(int i = 2; i<=2*T; i++)
{
if(i&1){
if(V[i] != (a*V[i-1]+b)%maxn)
{
ok = false;
break;
}
}
else V[i] = (a*V[i-1] + b)%maxn;
}
if(ok )
break;
}
for(int i = 2; i<=2*T; i+=2){
cout<<V[i]<<endl;
}
}