結果
問題 | No.981 一般冪乗根 |
ユーザー |
|
提出日時 | 2022-07-18 01:55:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,864 bytes |
コンパイル時間 | 3,576 ms |
コンパイル使用メモリ | 209,252 KB |
最終ジャッジ日時 | 2025-01-30 09:55:38 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | WA * 1 TLE * 42 MLE * 1 |
コンパイルメッセージ
In function ‘ll modpow(ll, ll, ll)’, inlined from ‘void solve()’ at main.cpp:125:16: main.cpp:48:12: warning: ‘x’ may be used uninitialized [-Wmaybe-uninitialized] 48 | while (n > 0) { | ~~^~~ main.cpp: In function ‘void solve()’: main.cpp:106:6: note: ‘x’ was declared here 106 | ll x; | ^
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i,n) for(ll i=0;i<n;i++)#define repl(i,l,r) for(ll i=(l);i<(r);i++)#define per(i,n) for(ll i=(n)-1;i>=0;i--)#define perl(i,r,l) for(ll i=r-1;i>=l;i--)#define fi first#define se second#define pb push_back#define ins insert#define pqueue(x) priority_queue<x,vector<x>,greater<x>>#define all(x) (x).begin(),(x).end()#define CST(x) cout<<fixed<<setprecision(x)#define rev(x) reverse(x);using ll=long long;using vl=vector<ll>;using vvl=vector<vector<ll>>;using pl=pair<ll,ll>;using vpl=vector<pl>;using vvpl=vector<vpl>;const ll MOD=1000000007;const ll MOD9=998244353;const int inf=1e9+10;const ll INF=4e18;const ll dy[8]={1,0,-1,0,1,1,-1,-1};const ll dx[8]={0,1,0,-1,1,-1,1,-1};template <typename T> inline bool chmax(T &a, T b) {return ((a < b) ? (a = b, true) : (false));}template <typename T> inline bool chmin(T &a, T b) {return ((a > b) ? (a = b, true) : (false));}map<ll,ll> factor(long long n) {map<ll,ll> ret;ll t=n;for (long long i = 2; i * i <= n; i++) {while (t % i == 0) {ret[i]++;t/=i;}}if(t!=1)ret[t]++;return ret;}ll modpow(ll a,ll n, ll mod) {a%=mod;if(a==0)return 0;ll res = 1;while (n > 0) {if (n & 1) res = res * a % mod;a = a * a % mod;n >>= 1;}return res;}random_device rd; mt19937 mt(rd());ll primitive_root(ll n){uniform_int_distribution<> rand(2,n-1);auto f=factor(n-1);while(1){ll r=rand(mt);bool ok=true;for(auto q:f){if(modpow(r,(n-1)/q.first,n)==1)ok=false;}if(ok)return r;}}ll euler_phi(ll n) {ll ret = n;for(ll i = 2; i * i <= n; i++) {if(n % i == 0) {ret -= ret / i;while(n % i == 0) n /= i;}}if(n > 1) ret -= ret / n;return ret;}void solve(){ll p,k,a;cin >> p >> k >> a;/*if(gcd(k,p-1)!=1){cout << -1 << endl;return;}*/ll e=0;ll r=primitive_root(p);{unordered_map<ll,ll> mp;ll now=1;for(ll i=1;i<50000;i++){now=now*r%p;mp[now]=i;}now=now*r%p;ll tmp=1;for(ll i=0;i<=50000;i++){ll ap=modpow(tmp,p-2,p)*a%p;if(mp.count(ap)){e=mp[ap]+i*50000;break;}}}//cout << r <<" " << e << endl;//cout << modpow(r,e,p) << endl;//x*k=e mod p-1 を求めるll x;{unordered_map<ll,ll> mp;ll now=0;for(ll i=0;i<50000;i++){mp[now]=i;now=(now+k)%(p-1);}ll tmp=0;for(ll i=0;i<50000;i++){ll ap=(e-tmp+(p-1))%(p-1);if(mp.count(ap)){x=i*50000+mp[ap];break;}tmp=(tmp+now)%(p-1);}}//cout << x << endl;ll ans=modpow(r,x,p);if(modpow(ans,k,p)!=a)cout << -1 << endl;else cout << ans << endl;}int main(){ll t;cin >> t;while(t--){solve();}}