Uva 12169 Disgruntled Judge(扩展欧几里得算法)

题目大意:给出数列的通项公式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;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/82938319