题目的大意是给你一个递推式Xi = (a*Xi-1 + b ) Mod 10001,然后告诉奇数项,要你求出偶数项。
解法就是枚举a,然后根据前两个奇数项算出b。
可以推出下面的式子:
然后因为gcd(a+1,10001) = 1,然后根据扩展欧几里得算出b来,随后再来验证,如果正确即为满足条件的解。
#include "stdio.h"
#include "string.h"
#include "math.h"
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXM 1
#define MAXN 1
#define max(a,b) a > b ? a : b
#define min(a,b) a < b ? a : b
#define Mem(a,b) memset(a,b,sizeof(a))
int Mod = 10001;
double pi = acos(-1.0);
double eps = 1e-6;
typedef struct{
int f,t,w,next;
}Edge;
Edge edge[MAXM];
int head[MAXN];
int kNum;
void addEdge(int f, int t, int w)
{
edge[kNum].f = f;
edge[kNum].t = t;
edge[kNum].w = w;
edge[kNum].next = head[f];
head[f] = kNum ++;
}
int T, num[105];
void exgcd(int a, int b, int &x, int &y){
if( !b ){
x = 1, y = 0;
}
else{
exgcd(b, a%b, y, x);
y -= x * ( a / b);
}
}
void solve(){
for(int a = 0; a <= 10000; a ++){
int p = ( a + 1 ) % Mod, q = 10001, r = 0, s = 0;
exgcd(p, q, r, s); //求出来的r即为解 不过此时方程是等于1,不是x3 - a^2 x1, 下面还要乘上它
r = ( num[1] - a * a % Mod * num[0] % Mod + Mod) % Mod * r % Mod;
int temp = (a * num[0] + r) % Mod;
int i;
for(i = 1; i < T; i ++){
int flag = (a * temp + r) % Mod;
if( num[i] != flag) break;
temp = (a * num[i] + r) % Mod;
}
if(i == T){
for(int j = 0; j < T; j ++){
printf("%d\n", (a * num[j] + r) % Mod);
}
break;
}
}
}
int main()
{
// freopen("d:\\test.txt", "r", stdin);
while(cin>>T){
for(int i = 0; i < T; i ++){
cin>>num[i];
}
solve();
}
return 0;
}