题目大意:给出数列的通项公式xi=(axi-1+b)mod 10001,给出T个整数,是这个数列的奇数项,求偶数项。
题目链接:https://vjudge.net/problem/UVA-12169
题目思路:已知x1,则x2=(x1 * a+b)%10001,将这个式子代入x3,
x3=(a(x1 * a+b)+b)%10001,即x3+10001* k=a * a * x1+(a+1)*b,
将已知项全部移到等式左边x3-a * a * x1=(a+1)b+10001(-k)
可有扩展欧几里得算法求出整数解
c++代码:
#include <iostream>
using namespace std;
const int maxn=205;
typedef long long LL;
LL v[maxn];
void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b) {
x=1;
y=0;
d=a;
return;
}
ex_gcd(b,a%b,d,x,y);
int tmp=x;
x=y;
y=tmp-y*(a/b);
}
int main() {
int T;
cin >> T;
for(int i=1;i<2*T;i+=2) {
cin >> v[i];
}
LL a1=v[1];
LL a3=v[3];
//cout << a3 << endl;
bool flag;
for(int i=1;i<=10000;i++) {
LL d,b,y;
ex_gcd(i+1,10001,d,b,y);
//cout << d << endl;
LL t=a3-i*i*a1;
if(t%d)continue;
b=b*t/d%10001;
//if(i==72)cout << b<< endl;
//if(b<0)continue;
flag=0;
//cout << b <<" " << i<< endl;
for(int j=2;j<=2*T;j+=2) {
v[j]=(i*v[j-1]+b)%10001;
//cout << v[j+1] <<" "<<v[j]<<endl;
if(j<2*T&&v[j+1]!=((i*v[j]+b)%10001)){
flag=1;
break;
} //cout << j << endl;
}
if(!flag)break;
}
if(!flag)
for(int i=2;i<=2*T;i+=2) {
cout<< v[i] << endl;
}
return 0;
}