uva 12169 Disgruntled Judge

法一直接暴力枚举a和b的值,法二扩展欧几里德算法。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int mod=10001;

int main()
{
    int x[205],t,i,flag,a,b,j;
    while(~scanf("%d",&t))
    {
        for(i=0;i<t;i++)
        {
            scanf("%d",&x[2*i+1]);
        }

        for(a = 0; a <= 10000; a++)
        {
            for(b = 0; b <= 10000; b++)
            {
                flag=1;
                x[2]=(a*x[1]+b)%mod;
                for(i=3;i<=2*t;i++)
                {
                    if(i%2==0)
                    {
                        x[i]=(x[i-1]*a+b)%mod;
                    }
                    else
                    {
                        if(x[i]!=(a*x[i-1]+b)%mod)
                        {
                            flag=0;
                            break;
                        }
                    }
                }
                if(flag) break;
            }
            if(flag) break;
        }
        for(i = 1; i <= t; i++)
        {
            printf("%d\n",x[2*i]%10001);
        }
    }
    return 0;
}
时间: 2024-12-25 15:39:54

uva 12169 Disgruntled Judge的相关文章

UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T-1], 输出x[2],x[4]......x[2T]. T<=100,0<=x<=10000. 如果有多种可能的输出,任意输出一个结果即可. 由于a和b都小于等于10000,直接枚举a和b暴力可以过.但是有没有更快的方法呢? 首先令递推式的i=2,那么x[2]=(a*x[1]+b)mod 1

UVA 12169 Disgruntled Judge【扩展欧几里德】

题意:随机选取x1,a,b,根据公式xi=(a*xi-1+b)%10001得到一个长度为2*n的序列,奇数项作为输入,求偶数项,若有多种,随机输出一组答案. 思路:a和b均未知,可以考虑枚举a和b,时间复杂度为10000*10000*100,但是题目数据比较水,这样枚举也是能过的.高效的做法是:枚举a,根据以下公式求出b. a*x1+b - MOD*y1 = x2; a*x2+b - MOD*y2 = x3; 解得: x3 - a*a*x1=(a+1)*b + MOD * y; 该方程为关于变量

hdu 2769 uva 12169 Disgruntled Judge 拓展欧几里德

//数据是有多水 连 10^10的枚举都能过 关于拓展欧几里德:大概就是x1=y2,y1=x2-[a/b]y2,按这个规律递归到gcd(a,0)的形式,此时公因数为a,方程也变为a*x+0*y=gcd(a,0)的形式,显然解为x=1,y=0,然后再递归回去就能得到解(a*x+b*y=gcd(a,b)的解) 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm&g

12169 - Disgruntled Judge

枚举a和b...耗时0.126        显然这不是最好的方法,最好的方法是至需枚举a,利用扩展欧几里德算法求出线性模方程.求的b:其实我也还没有理解,等学会了再来更新.. #include<bits/stdc++.h> using namespace std; int T,a[109],b[109]; void solve() { for(int i=10000;i>=0;--i) for(int j=10000;j>=0;--j){ int kase=0; bool ok=

【UVA】12169-Disgruntled Judge(暴力or欧几里得)

可能由于后台数据的原因,这道题直接暴力枚举a,b进行判断也能过,不过跑的时间长,效率太差了. 14021006 12169 Disgruntled Judge Accepted C++ 0.876 2014-08-11 08:46:28 不说了,比较无脑. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #incl

HDOJ 2769 Disgruntled Judge 扩展GCD

扩展GCD: 枚举a,扩展GCD求b,再暴力检查 Disgruntled Judge Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 329    Accepted Submission(s): 142 Problem Description Once upon a time, there was an nwerc judge with

UVa 489 Hangman Judge(字符串)

 Hangman Judge  In ``Hangman Judge,'' you are to write a program that judges a series of Hangman games. For each game, the answer to the puzzle is given as well as the guesses. Rules are the same as the classic game of hangman, and are given as follo

UVa 12169 (枚举+扩展欧几里得) Disgruntled Judge

题意: 给出四个数T, a, b, x1,按公式生成序列 xi = (a*xi-1 + b) % 10001 (2 ≤ i ≤ 2T) 给出T和奇数项xi,输出偶数项xi 分析: 最简单的办法就是直接枚举a.b,看看与输入是否相符. 1 #include <cstdio> 2 3 const int maxn = 10000 + 5; 4 const int M = 10001; 5 int T, x[maxn]; 6 7 int main() 8 { 9 //freopen("12

Disgruntled Judge UVA - 12169(扩展欧几里得应用+暴力)

题目给我们的输入数值都是序列中的单数项,我们已知递推公式xi=(aXi-1 + b)mod10001, 所以我们可以将X2表示为X2=(aX1 + b)mod10001,将X3表示为X3=(aX2 + b)mod10001 然后将X2的式子带入到X3中得:X3=(a(aX1 + b)mod10001 + b)mod10001 X3=(a(aX1 + b)+ b)mod10001 X3+10001*k=a*a*X1+a*b+b 10001(-k)+(a+1)b=X3-a*a*X1 --1式 推导出