uva12169(扩展欧几里得)

  题目的大意是给你一个递推式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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值