【数论】[Uva12169]Disgruntled Judge
题目
分析:x2=(ax1+b)%MOD
x3=(a(ax1+b)+b)%MOD=(a^2*x1+(a+1)+b)^MOD
x3+MOD*k=a^2*x1+(a+1)b
(a+1)b+MOD*k=x3-a^2*x1
枚举a,用exgcd求出b,再进行验证。
代码:
#include<cstdio>
#define MAXN 1000
#define MOD 10001
typedef long long LL;
LL n,x[MAXN+10];
void exgcd(LL a,LL b,LL &d,LL &x,LL &y){
if(!b){
d=a;
x=1;
y=0;
return;
}
exgcd(b,a%b,d,y,x);
y-=a/b*x;
}
int main()
{
scanf("%d",&n);
n*=2;
LL i,a,d,t,b,k;
bool f;
for(i=1;i<n;i+=2)
scanf("%d",&x[i]);
for(a=0;a<MOD;a++){
exgcd(a+1,MOD,d,b,k);
t=x[3]-a*a*x[1];
if(a==1096)
t=t;
if(t%d)
continue;
b*=t/d,k*=t/d;
b+=(k+a)/((a+1)/d)*(MOD/d);
f=0;
for(i=2;i<=n;i++)
if(i&1){
if(x[i]!=(a*x[i-1]+b)%MOD)
f=1;
if(f)
break;
}
else
x[i]=(a*x[i-1]+b)%MOD;
if(f)
continue;
for(i=2;i<=n;i+=2)
printf("%lld\n",x[i]);
break;
}
}
//x3 - a * a * x1 = (a + 1) * b + 10001 * (-k);