poj 2115 C Looooops

单变元模线性方程模板。

View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<string>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iomanip>
 7 #include<map>
 8 #include<set>
 9 #include<vector>
10 #include<algorithm>
11 #include<cmath>
12 using namespace std;
13 
14 typedef long long ll;
15 const ll maxn = 100000 + 100;
16 ll A, B, C, D, K;
17 //扩展欧几里德
18 void extend_gcd(ll a, ll b, ll& d, ll& x, ll& y)
19 {
20     if(!b)
21     {
22         d = a; x = 1; y = 0;
23     }
24     else
25     {
26         extend_gcd(b, a % b, d, y, x);
27         y -= (a / b) * x;
28     }
29 }
30 // ax = b (mod n)
31 /*
32 vector <ll> line_mod_equation(ll a, ll b, ll n)
33 {
34     ll x, y, d;
35     extend_gcd(a, n, d, x, y);
36     vector<ll> ans;
37     ans.clear();
38     if(b % d == 0)
39     {
40         x = (x % n + n) % n;
41         ans.push_back(x * (b / d) % (n / d));
42         for(ll i = 1; i < d; ++i)
43         {
44             ans.push_back((ans[0] + i * n / d) % n);
45         }
46 
47     }
48     return ans;
49 }
50 */
51 ll line_mod_equation(ll a, ll b, ll n)
52 {
53     ll x, y, d;
54     extend_gcd(a, n, d, x, y);
55     vector<ll> ans;
56     ans.clear();
57     if(b % d == 0)
58     {
59         x = (x % n + n) % n;
60         return x * (b / d) % (n / d);
61     }
62     return -1;
63 }
64 int main()
65 {
66     //freopen("in.txt", "r", stdin);
67     //freopen("out.txt", "w", stdout);
68     while(cin >> A >> B >> C >> K)
69     {
70         if(A == 0 && B == 0 && C == 0 && K == 0) break;
71         ll MOD = 1LL << K;
72         D = ((B % MOD - A % MOD) % MOD + MOD) % MOD;
73         ll ans = line_mod_equation(C, D, MOD);
74         if(ans == -1)
75         {
76             cout << "FOREVER" << endl;
77         }
78         else
79         {
80             cout << ans << endl;
81         }
82     }
83     return 0;
84 }

 

posted @ 2013-02-12 18:55  ACSeed  Views(97)  Comments(0)    收藏  举报