結果
問題 | No.1255 ハイレーツ・オブ・ボリビアン |
ユーザー |
|
提出日時 | 2020-10-10 01:50:05 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,436 bytes |
コンパイル時間 | 2,171 ms |
コンパイル使用メモリ | 208,608 KB |
最終ジャッジ日時 | 2025-01-15 06:08:44 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 13 WA * 1 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;}template<typename T>vector<T> divisor(T n) {vector<T> res;for (T i = 1; i * i <= n; i++) {if (n % i == 0) {res.emplace_back(i);if (i != n / i) res.emplace_back(n / i);}}return res;}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);vector<ll> d = divisor(ans);sort(d.begin(), d.end());ans = -1;for (ll x : d) {if (modpow(2, x, 2 * n - 1) == 1) {ans = x;break;}}cout << ans << newl;}return 0;}