BZOJ2242【BSGS】

来源:互联网 发布:手游热门网络游戏知乎 编辑:程序博客网 时间:2024/06/09 22:46
/* I will wait for you*/#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <algorithm>#include <iostream>#include <fstream>#include <vector>#include <queue>#include <deque>#include <map>#include <set>#include <string>#include <ext/hash_map>#define make make_pair#define fi first#define se secondusing namespace std;using namespace __gnu_cxx;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;const int maxn = 200010;const int maxm = 1010;const int maxs = 26;const int inf = 0x3f3f3f3f;const int P = 1000000007;const double error = 1e-9;inline int read(){int x = 0, f = 1;char ch = getchar();while (ch <= 47 || ch >= 58)f = (ch == 45 ? -1 : 1), ch = getchar();while (ch >= 48 && ch <= 57)x = x * 10 + ch - 48, ch = getchar();return x * f;}ll x, y, z, p;hash_map<int, ll> ex;ll qpow(ll a, ll b){ll ans = 1, tmp = a;for (; b; (tmp *= tmp) %= p, b /= 2)if (b & 1ll)(ans *= tmp) %= p;return ans;}int num[maxn];ll solve(ll a, ll b){ll step = (ll) sqrt(p);num[0] = 1, ex.clear();for (int i = 1; i <= step; i++)num[i] = (ll) (num[i - 1]) * a % p;ll inv = qpow(num[step], p - 2);for (int i = 0; i < step; i++)if (!ex.count(num[i]))ex[num[i]] = i;for (int i = 0; i * step <= p; i++) {if (ex.count(b))return i * step + ex[b];(b *= inv) %= p;}return -1;}int main(){int n = read(), t = read();for (int i = 1; i <= n; i++) {y = read(), z = read(), p = read();if (t == 1)x = qpow(y, z);if (t == 2)x = y % p == 0 ? -1 : z * qpow(y, p - 2) % p;if (t == 3)x = y % p == 0 ? -1 : solve(y, z);if (x >= 0)printf("%d\n", x);elseprintf("Orz, I cannot find x!\n");}return 0;}

0 0
原创粉丝点击