虽然到现在还看不懂扩欧的原理是什么,但是记住模板会用就完事了!
扩欧公式:ax+by=c;
本题推导公式:(a+1)b+10001k=x3-aax1;
带入公式就能求出来b,之后验证b是否满足数列即可。(扩欧的作用:可以求出来b和k);
附上AC模板
hint:注意要开ll,会爆int;
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=1e6+10;
const ll inlld=0x3f3f3f3f3f3f3f3f,mod=10001;
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
typedef pair<int,int> p;
int x[N];
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b){
d=a;x=1;y=0;
}
else {
exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
}
int main()
{
ios::sync_with_stdio(false);
ll n;cin>>n;
for(ll i=1;i<=2*n;i+=2){
cin>>x[i];
}
for(ll a=0;a<=10000;a++){
ll c,k,d,b;
c=x[3]-a*a*x[1];
exgcd(a+1,10001,d,b,k);
if(c%d)continue;
int fg=1;
b=b*(c/d);
for(int i=2;i<=2*n;i++){
if(i&1){
if(x[i]!=(a*x[i-1]+b)%mod){
fg=0;
break;
}
}
else {
x[i]=(a*x[i-1]+b)%mod;
}
}
if(fg){
break;
}
}
for(int i=2;i<=2*n;i+=2)cout<<x[i]<<endl;
return 0;
}
/*
3
17
822
3014
*/