UVa12169 Disgruntled Judge

x2 = (a * x1 + b) % 10001;
x3 = (a * x2 + b) % 10001;

∴x3 = (a * (a * x1 + b) % 10001 + b ) % 10001;

∴(a + 1) * b + 10001 * (-k) = x3 - a * a * x1

由于a的范围是1~10000,所以可以枚举a,解出b,暴力判断这组a和b能否适用于所有的x

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define LL long long
 8 using namespace std;
 9 const int mod=10001;
10 const int mxn=50000;
11 LL num[mxn];
12 LL x[mxn];
13 LL k,b;
14 int n;
15 LL exgcd(LL a,LL b,LL &x,LL &y){
16     if(!b){
17         x=1;y=0;
18         return a;
19     }
20     LL tmp=exgcd(b,a%b,x,y);
21     LL t=x;x=y;y=t-a/b*y;
22     return tmp;
23 }
24 int main(){
25     scanf("%d",&n);
26     int i,j;
27     for(i=1;i<=n;i++){
28         scanf("%lld",&num[i]);
29     }
30     for(int a=0;a<mod;a++){
31         LL tmp=num[2]-a*a*num[1];
32         LL gcd=exgcd(a+1,mod,k,b);
33         if(tmp%gcd)continue;
34 //        printf("test:%lld\n",tmp);
35         b=k*tmp/gcd%mod;
36         bool ok=1;
37         x[1]=(num[1]*a+b)%mod;
38         for(i=2;i<=n;i++){
39             if(num[i]!=(x[i-1]*a+b)%mod){
40                 ok=0;
41                 break;
42             }
43             x[i]=(num[i]*a+b)%mod;
44         }
45         if(!ok)continue;
46         //if ok
47             for(i=1;i<=n;i++)printf("%lld\n",x[i]);
48             break;
49     }
50     return 0;
51 }
时间: 2024-09-30 00:29:34

UVa12169 Disgruntled Judge的相关文章

UVa12169 - Disgruntled Judge(模运算)

如果知道了a,就能算出x2,根据x3=(ax2+b)mod10001算出b. 然后可在O(T)时间内计算出整个序列. 如果在计算中发现和输入矛盾,则a非法,因为a是0~10000的整数,即使枚举所有a,时间效率也足够高. 枚举a,利用x1,x3求出b,判断所有x的关系能不能满足a,b. 如何通过a,x1,x3求出b呢. x2 = (a * x1 + b) % 10001; x3 = (a * x2 + b) % 10001; 联立2个式子 x3 = (a * (a * x1 + b) % 100

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 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 <

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

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

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【扩展欧几里德】

题意:随机选取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; 该方程为关于变量

hud2769 Disgruntled Judge(扩展欧几里德算法)

题目链接:点击打开链接 题目描述: 给出三个数x1,a,b,然后根据递推公式xi=(axi-1+b)mod10001,计算出了一个长度为2T的数列.然后把T和x1,x3,x5··· x2T-1写到输入文件,x2,x4,x4,···x2T作为输出文件 输入保证T<=100,如果有多种可能,任意输出一种即可 解题思路:如果知道a,我们就可以通过x1,x3,计算出b.有了x1,a,b我们就可以在O(T)的时间内求的整个序列.如果在计算中发现和输入矛盾,则这个a是非法的.由于mod10001,所以a是0

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