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 }


浙公网安备 33010602011771号