思路: x3=(a(a*x1+b)%10001)+b)%10001
a*b+b+y*10001=x3-a*a*x1
对应a*x+b*y=c;
a=(a+1),b=10001,c=x3-a*a*x1。
枚举a的值,扩欧解不定方程解出x。
判断该x是否满足整个序列。
注意:该题要用long long,不然会运行不出结果。。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define fo freopen("in.txt","r",stdin)
#define fc fclose(stdin)
#define fu0(i,n) for(i=0;i<n;i++)
#define fu1(i,n) for(i=1;i<=n;i++)
#define fd0(i,n) for(i=n-1;i>=0;i--)
#define fd1(i,n) for(i=n;i>0;i--)
#define mst(a,b) memset(a,b,sizeof(a))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define ss(s) scanf("%s",s)
#define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k)
#define pans() prllf("%d\n",ans)
#define all(a) a.begin(),a.end()
#define sc(c) scanf("%c",&c)
#define we(a) while(scanf("%d",&a)!=EOF)
const ll maxn=200005;
const double eps=1e-8;
void kgcd(ll a,ll b,ll &d,ll &x,ll &y)//ax+by=gcd(a,b),d是gcd(a,b)
{
if(!b)
{d=a;x=1;y=0;}
else
{kgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int main()
{
ll n;
cin>>n;
ll f[10005];
memset(f,0,sizeof(f));
for(int i=1;i<=2*n;i+=2)
{
cin>>f[i];
}
ll a,x,y,m,b,d,c;
for( a=0;;a++)
{
c=f[3]-a*a*f[1];
b=10001;
m=a+1;
kgcd(m,b,d,x,y);
if(c%d)
continue;
x=x*(c/d);
y=y*(c/d);
ll i;
ll flag=0;
for( i=2;i<=2*n;i++)
{
flag=0;
ll t=(a*f[i-1]+x)%10001;
if(i%2)
{
if(t!=f[i])
{
flag=1;
break;
}
}
else
{
f[i]=t;
}
}
if(!flag)
{
break;
}
}
for(ll i=2;i<=2*n;i+=2)
{
cout<<f[i]<<endl;
}
return 0;
}