uva12169(扩展欧几里得)

来源:互联网 发布:excel不规则数据分列 编辑:程序博客网 时间:2024/05/29 14:10

  题目的大意是给你一个递推式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
原创粉丝点击