結果
問題 | No.1255 ハイレーツ・オブ・ボリビアン |
ユーザー |
|
提出日時 | 2020-10-10 01:39:08 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,961 bytes |
コンパイル時間 | 1,540 ms |
コンパイル使用メモリ | 174,952 KB |
実行使用メモリ | 6,400 KB |
最終ジャッジ日時 | 2024-07-20 15:18:09 |
合計ジャッジ時間 | 10,281 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 4 WA * 10 TLE * 1 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;constexpr char newl = '\n';vector<int> pi_func(int n) {vector<int> res(2 * n);for (int i = 0; i < 2 * n; i++) {if (i % 2 == 0) res[i] = i / 2;else res[i] = n + i / 2;}return res;}struct UnionFind {//各要素が属する集合の代表(根)を管理する//もし、要素xが根であればdata[x]は負の値を取り、-data[x]はxが属する集合の大きさに等しいvector<int> data;UnionFind(int sz) : data(sz, -1) {}bool unite(int x, int y) {x = find(x);y = find(y);bool is_union = (x != y);if (is_union) {if (data[x] > data[y]) swap(x, y);data[x] += data[y];data[y] = x;}return is_union;}int find(int x) {if (data[x] < 0) { //要素xが根であるreturn x;} else {data[x] = find(data[x]); //data[x]がxの属する集合の根でない場合、根になるよう更新されるreturn data[x];}}bool same(int x, int y) {return find(x) == find(y);}int size(int x) {return -data[find(x)];}};const ll MOD = 1000000007;ll modpow(ll x, ll n, ll mod = MOD) {ll res = 1;while (n > 0) {if (n & 1) res = res * x % mod;x = x * x % mod;n >>= 1;}return res;}// y * y >= x を満たす最小の整数yを求めるll calcSquare(ll x) {ll ng = 0, ok = x;while (ok - ng > 1) {ll mid = (ng + ok) / 2;(mid * mid >= x ? ok : ng) = mid;}return ok;}// a * x + b * y == gcd(a, b) なるx, yを計算// 返り値はgcd(a, b)template<typename T>T extgcd(T a, T b, T& x, T& y) {T d = a;if (b != 0) {d = extgcd(b, a % b, y, x);y -= (a / b) * x;} else {x = 1; y = 0;}return d;}// g^x == y (mod p) の解xを求める(なければ-1を返す)ll modlog(ll g, ll y, ll p = MOD) {g %= p;y %= p;if (g == 1 && y != 1) return -1;if (y == 1) return 0;ll sq = calcSquare(p);map<ll, ll> baby_table;for (ll i = 0, b = 1; i < sq; i++) {baby_table[b] = i;(b *= g) %= p;}ll inv_gsq = modpow(y, sq, p);for (ll i = 0; i < sq; i++) {if (baby_table.find(y) != baby_table.end()) {return i * sq + baby_table[y];}(y *= inv_gsq) %= p;}return -1;}int main() {cin.tie(nullptr);ios::sync_with_stdio(false);int t;cin >> t;for (int i = 0; i < t; i++) {ll n;cin >> n;ll foo, bar;extgcd(2LL, 2 * n - 1, foo, bar);if (foo < 0) foo += 2 * n - 1;foo %= 2 * n - 1;ll ans = (n == 1 ? 1 : modlog(2, foo, 2 * n - 1) + 1);cout << ans << newl;}return 0;}