题目链接
参考了大佬题解思路摘抄如下:
因为(a*x1+b)%10001=x2
(a*x2+b)%10001=x3
x3 = (a * (a * x1 + b) % 10001 + b ) % 10001;
x3 = (a * (a * x1 + b) + b) % 10001;
所以 x3 + 10001 * k = a * a * x1 + (a + 1) * b;
x3 - a * a * x1 = (a + 1) * b + 10001 * (-k);
枚举a,求解b
扩展欧几里得。
注意x3-a*a要是gcd(a+1,10001)的倍数才有解
#include<cstdio>
typedef long long ll;
const int N=1e4+10;
const int mod=10001;
ll ans[N<<1];
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-=a/b*x;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(~scanf("%d",&n))
{
n*=2;
bool flag=0;
for(int i=1;i<n;i+=2)
scanf("%lld",&ans[i]);
ll a,x,y,d;
for(a=0;;a++)
{
bool flag=0;
exgcd(a+1,mod,d,x,y);//注意a+1
ll tmp=ans[3]-ans[1]*a*a;
if(tmp%d)continue;
x=x*tmp/d;
for(int i=2;i<=n;i++)
{
if(i%2==1)
{
if(ans[i]!=(ans[i-1]*a+x)%mod)
{
flag=1;
break;
}
}
else ans[i]=(a*ans[i-1]+x)%mod;
}
if(!flag)break;
}
for(int i=2;i<=n;i+=2)
printf("%lld\n",ans[i]);
}
return 0;
}