随机选取x1,a,b,根据公式xi=(a*xi-1+b)%10001得到一个长度为2*n的序列,奇数项作为输入,求偶数项,若有多种,随机输出一组答案。
按照x2和x3的公式联立,可以获得一个关于x1和x3的同余方程。然后利用拓展欧几里得枚举a解出一个b0,然后找出可行的b。
虽然说会说但是我完全是懵逼的哈哈哈哈哈哈哈。
AC代码:
#include <iostream>
using namespace std;
const int maxn=10010;
const int mod=10001;
int in[maxn];
typedef long long LL;
LL exgcd(LL a,LL b, LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL r=exgcd(b,a%b,y,x);
LL t=x;
y=y-a/b*t;
return r;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
cin>>in[i];
bool flag;
for(LL a=0;a<=10000;a++)
{
LL x,y;
LL g=exgcd(a+1,mod,x,y);
LL tmp=in[1]-a*a*in[0];
if(tmp%g==0)
{
flag=0;
LL b=(x*tmp/g)%mod;
for(int i=1;i<t;i++)
{
if(in[i]!=(a*(a*in[i-1]+b)+b)%mod)
{
flag=1;
break;
}
}
if(!flag)
{
for(int i=0;i<t;i++)
cout<<(a*in[i]+b)%mod<<endl;
break;
}
}
}
return 0;
}