蒟蒻求助

P4195 【模板】扩展 BSGS/exBSGS

我改了一下我的代码,但还是只有 40 分。 代码: ```cpp #include <iostream> #include <unordered_map> #include <cmath> using namespace std; typedef long long ll; unordered_map<int, int> mp; inline int quick_pow(int x, int p, int mod){ int ans = 1; while (p){ if (p & 1) ans = (ll)ans * x % mod; x = (ll)x * x % mod; p >>= 1; } return ans; } inline int BSGS(int a, int b, int p){ if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; int m = sqrt(p) + 1, x, y = 1, z; mp.clear(); a %= p; b %= p; x = b; z = quick_pow(a, m, p); mp[x] = 0; for (register int i = 1; i < m; i++){ x = (ll)x * a % p; mp[x] = i; } for (register int i = 1; i <= m; i++){ y = (ll)y * z % p; if (mp.count(y)){ return i * m - mp[y]; } } return -1; } int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b); } void exgcd(int a, int b, int &x, int &y){ if (b == 0){ x = 1; y = 0; return; } exgcd(b, a % b, x, y); int temp = x; x = y; y = temp - a / b * y; } inline int inv(int a, int b){ int x, y; exgcd(a, b, x, y); return x; } inline int exBSGS(int a, int b, int p){ if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; int x = 0, y = 1, t, ans; a %= p; b %= p; while ((t = gcd(a, p)) != 1){ if (b % t != 0) return -1; x++; b /= t; p /= t; y = (ll)y * (a / t) % p; if (b == y) return x; } ans = BSGS(a, (ll)b * inv(y, p) % p, p); if (ans == -1) return -1; return ans + x; } int main(){ while (true){ int a, p, b, ans; cin >> a >> p >> b; if (a == 0 && p == 0 && b == 0) break; ans = exBSGS(a, b, p); if (ans == -1){ cout << "No Solution" << endl; } else { cout << ans << endl; } } return 0; } ```
by Leasier @ 2020-03-14 21:02:56


我又改了一下我的代码,但还是只有 40 分。 代码: ```cpp #include <iostream> #include <unordered_map> #include <cmath> using namespace std; typedef long long ll; unordered_map<ll, ll> mp; inline ll quick_pow(ll x, ll p, ll mod){ ll ans = 1; while (p){ if (p & 1) ans = ans * x % mod; x = x * x % mod; p >>= 1; } return ans; } inline ll BSGS(ll a, ll b, ll p){ if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; ll m = sqrt(p) + 1, x, y = 1, z; mp.clear(); a %= p; b %= p; x = b; z = quick_pow(a, m, p); mp[x] = 0; for (register ll i = 1; i < m; i++){ x = x * a % p; mp[x] = i; } for (register ll i = 1; i <= m; i++){ y = y * z % p; if (mp.count(y)){ return i * m - mp[y]; } } return -1; } ll gcd(ll a, ll b){ return b == 0 ? a : gcd(b, a % b); } void exgcd(ll a, ll b, ll &x, ll &y){ if (b == 0){ x = 1; y = 0; return; } exgcd(b, a % b, x, y); ll temp = x; x = y; y = temp - a / b * y; } inline ll inv(ll a, ll b){ ll x, y; exgcd(a, b, x, y); return x; } inline ll exBSGS(ll a, ll b, ll p){ if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; ll x = 0, y = 1, t, ans; a %= p; b %= p; while ((t = gcd(a, p)) != 1){ if (b % t != 0) return -1; x++; b /= t; p /= t; y = y * (a / t) % p; if (b == y) return x; } ans = BSGS(a, b * inv(y, p) % p, p); if (ans == -1) return -1; return ans + x; } int main(){ while (true){ int a, p, b; ll ans; cin >> a >> p >> b; if (a == 0 && p == 0 && b == 0) break; ans = exBSGS(a, b, p); if (ans == -1){ cout << "No Solution" << endl; } else { cout << ans << endl; } } return 0; } ```
by Leasier @ 2020-03-15 17:05:46


我再改了一下我的代码,但还是只有 40 分。 代码: ```cpp #include <iostream> #include <unordered_map> #include <cmath> using namespace std; typedef long long ll; unordered_map<ll, ll> mp; inline ll quick_pow(ll x, ll p, ll mod){ ll ans = 1; while (p){ if (p & 1) ans = ans * x % mod; x = x * x % mod; p >>= 1; } return ans; } inline ll BSGS(ll a, ll b, ll p){ a %= p; b %= p; if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; ll m = sqrt(p) + 1, x, y = 1, z; mp.clear(); x = b; z = quick_pow(a, m, p); mp[x] = 0; for (register ll i = 1; i < m; i++){ x = x * a % p; mp[x] = i; } for (register ll i = 1; i <= m; i++){ y = y * z % p; if (mp.count(y)){ return i * m - mp[y]; } } return -1; } ll gcd(ll a, ll b){ return b == 0 ? a : gcd(b, a % b); } void exgcd(ll a, ll b, ll &x, ll &y){ if (b == 0){ x = 1; y = 0; return; } exgcd(b, a % b, x, y); ll temp = x; x = y; y = temp - a / b * y; } inline ll inv(ll a, ll b){ ll x, y; exgcd(a, b, x, y); return x; } inline ll exBSGS(ll a, ll b, ll p){ if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; ll x = 0, y = 1, t, ans; while ((t = gcd(a, p)) != 1){ if (b % t != 0) return -1; x++; b /= t; p /= t; y = y * (a / t) % p; if (b == y) return x; } a %= p; b %= p; ans = BSGS(a, b * inv(y, p) % p, p); if (ans == -1) return -1; return ans + x; } int main(){ while (true){ int a, p, b; ll ans; cin >> a >> p >> b; if (a == 0 && p == 0 && b == 0) break; ans = exBSGS(a, b, p); if (ans == -1){ cout << "No Solution" << endl; } else { cout << ans << endl; } } return 0; } ```
by Leasier @ 2020-03-17 09:48:23


我又改了一下我的代码,但还是只有 40 分。 代码: ```cpp #include <iostream> #include <unordered_map> #include <cmath> using namespace std; typedef long long ll; unordered_map<ll, ll> mp; inline ll quick_pow(ll x, ll p, ll mod){ ll ans = 1; while (p){ if (p & 1) ans = ans * x % mod; x = x * x % mod; p >>= 1; } return ans; } inline ll bsgs(ll a, ll b, ll p){ a %= p; b %= p; if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; ll m = sqrt(p) + 1, x, y = 1, z; mp.clear(); x = b; z = quick_pow(a, m, p); mp[x] = 0; for (register ll i = 1; i < m; i++){ x = x * a % p; mp[x] = i; } for (register ll i = 1; i <= m; i++){ y = y * z % p; if (mp.count(y)){ return i * m - mp[y]; } } return -1; } ll gcd(ll a, ll b){ return b == 0 ? a : gcd(b, a % b); } inline ll exbsgs(ll a, ll b, ll p){ a %= p; b %= p; if (b == 1) return 0; if (a == 0) return b == 0 ? 1 : -1; if (b == 0){ ll x = 0, y = 1, t; while ((t = gcd(a, p)) != 1){ if (b % t != 0) return -1; x++; b /= t; p /= t; y = y * (a / t) % p; if (b == y) return x; } return -1; } ll x = 0, y = 1, t, ans; while ((t = gcd(a, p)) != 1){ if (b % t != 0) return -1; x++; b /= t; p /= t; y = y * (a / t) % p; if (b == y) return x; } ans = bsgs(a, b, p); if (ans == -1) return -1; return ans + x; } int main(){ while (true){ int a, p, b; ll ans; cin >> a >> p >> b; if (a == 0 && p == 0 && b == 0) break; ans = exbsgs(a, b, p); if (ans == -1){ cout << "No Solution" << endl; } else { cout << ans << endl; } } return 0; } ```
by Leasier @ 2020-03-18 20:59:44


|