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("12169in.txt", "r", stdin);
10
11     scanf("%d", &T);
12     for(int i = 1; i < 2*T; i += 2)
13         scanf("%d", &x[i]);
14
15     bool ok;
16     for(int a = 0; a < M; ++a)
17     {
18         for(int b = 0; b < M; ++b)
19         {
20             ok = true;
21             for(int i = 2; i <= 2*T; i += 2)
22             {
23                 x[i] = (x[i-1]*a + b) % M;
24                 if(i < 2*T && x[i+1] != (x[i]*a + b) % M)
25                 {
26                     ok = false;
27                     break;
28                 }
29             }
30             if(ok) break;
31         }
32         if(ok) break;
33     }
34
35     for(int i = 2; i <= 2*T; i += 2)
36         printf("%d\n", x[i]);
37
38     return 0;
39 } 

代码君

第二种办法枚举a,根据x1、x3求b。

详见这里

 1 #include <cstdio>
 2
 3 typedef long long LL;
 4 const int maxn = 10000 + 5;
 5 const LL M = 10001;
 6 int T;
 7 LL x[maxn];
 8
 9 void gcd(LL a, LL b, LL& d, LL& x, LL& y)
10 {
11     if(!b) { d = a; x = 1; y = 0; }
12     else { gcd(b, a%b, d, y, x); y -= x*(a/b); }
13 }
14
15 int main()
16 {
17     //freopen("12169in.txt", "r", stdin);
18
19     scanf("%d", &T);
20     for(int i = 1; i < 2*T; i += 2)
21         scanf("%lld", &x[i]);
22
23     bool ok;
24     for(LL a = 0; a < M; ++a)
25     {
26         LL t = x[3] - a*a*x[1];
27         LL g, k, b;
28         gcd(a+1, M, g, b, k);
29         if(t % g != 0) continue;
30         b *= t / g;
31
32         ok = true;
33         for(int i = 2; i <= 2*T; i += 2)
34         {
35             x[i] = (x[i-1]*a+b) % M;
36             if(i < 2*T && x[i+1] != (x[i]*a+b) % M)
37             {
38                 ok = false;
39                 break;
40             }
41         }
42         if(ok) break;
43     }
44
45     for(int i = 2; i <= 2*T; i += 2)
46         printf("%lld\n", x[i]);
47
48     return 0;
49 } 

代码君

时间: 2024-10-29 10:45:44

UVa 12169 (枚举+扩展欧几里得) Disgruntled Judge的相关文章

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式 推导出

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

[codeforces 200 E Tractor College]枚举,扩展欧几里得,三分

题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz=s,使得f(x,y,z)=|ax-by|+|by-cz|最小 思路:枚举z,得到一个方程ax+by=s-cz,用扩展欧几里得求出这个方程的一个解,然后三分通解的整系数,求出最小f值.至于为什么可以三分画画图就清楚了,两个绝对值函数叠加在一起最多只有三种状态(第一维表示临界点较小的那个绝对值函数):(降,降)

UVa 11768 格点判定(扩展欧几里得求线段整点)

https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后对于扩展欧几里得有了全面的了解. 根据两点式公式求出直线 ,那么ax+by=c 中的a.b.c都可以确定下来了. 接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解,其中,K取任何整数. 需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b

UVA 10090 Marbles(扩展欧几里得)

Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass balls) and I am going to buy some boxes to store them. The boxes are of two types: Type 1: each box costs c1 Taka and can hold exactly n1 marbles Type 2:

扩展欧几里得定理总结

拓展欧几里得定理主要用来求解同余线性方程,求逆元等,遇到题目给出形如ax+by==c,要求一组满足要求的x和y时,可以联系扩展欧几里得求解 拓展欧几里得由 gcd(a,b) = gcd(b,a%b) 推出 由于 a*x + b*y == gcd(a,b) 必定有解 所以 b*x + (a%b)*y == gcd(b,a%b) 最终得到ax+by==a*y1+b*(x1-(a/b)*y1) 当x0 y0 是方程的一组解,可以得到所有解的形式满足 x=x0+b/d*t y=y0-a/d*t 当 题目

URAL 1204. Idempotents (扩展欧几里得)

题目链接 题意 : 给你一个同余方程, x*x ≡ x  (mod n),让你求出所有的小于n的x. 思路 : 先来看同余的概念 :给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a-b),那么就称整数a与b对模m同余,记作a≡b(mod m).对模m同余是整数的一个等价关系. 因此题目中给定的式子可以写成:(x*x-x)/n=k.也就是说(x*x-x)是n的整数倍,取余n是0. 因为n=p*q,而且gcd(p,q)=1 ;所以上式可以写为,x*(x-1)/(p*q)=k. 让

HDU 4596 - Yet another end of the world(扩展欧几里得)

题意:给定一系列的虫洞,每个虫洞都有自己的x,y,z,当你的 id 对 x 取余后结果落在[ y,z ]区间内,则会被吸引,被两个或两个以上的虫洞吸引会有危险,求能否宇宙飞船能否起飞. 枚举每两个虫洞,有 id - k1 * x1 = u id - k2 * x2 = v 其中k1与k2分别为 id / x1 与 id / x2,u与v分别为求余后的结果. 两式相减得  k2 * x2 - k1 * x1 = u - v 根据扩展欧几里得,判断 u - v 的取值是否能取到 gcd(x1, x2

扩展欧几里得与二元不定方程

二元不定方程,就是形同ax+by=c的二元方程, 只不过有无数组解罢了. 还有原谅我蒟蒻,不会用字母的写法,只好直觉+小学数学写法了 我们可以使用辗转相除法来解决(过渡好生硬啊) 我们首先来看一组例子 为了方便理解,特将每个多项式系数都写了出来,同时并没有将符号带进括号 37x-107y=25 37x-(37*2+33)y=25 37(x-2y)-33y=25 (-33*-1+4)(x-2y)-33y=25 -33(-x+3y)+4(x-2y)=25 (4*-8-1)(-x+3y)+4(x-2y