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 } 
代码君

 

posted @ 2014-12-14 03:52  AOQNRMGYXLMV  阅读(442)  评论(0编辑  收藏  举报