結果
問題 | No.981 一般冪乗根 |
ユーザー |
|
提出日時 | 2022-07-18 02:36:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,949 bytes |
コンパイル時間 | 3,007 ms |
コンパイル使用メモリ | 208,272 KB |
最終ジャッジ日時 | 2025-01-30 10:25:26 |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 23 TLE * 20 MLE * 1 |
ソースコード
#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<int,int> mp;ll now=1;for(int i=0;i<10000;i++){mp[now]=i;now=now*r%p;}ll ap=a;ll invnow=modpow(now,p-2,p);for(int i=0;i<100001;i++){if(mp.count(ap)){e=mp[ap]+i*10000;break;}ap=ap*invnow%p;}}//cout << r <<" " << e << endl;//if(modpow(r,e,p)!=a)cout <<"WA"<< endl;//x*k=e mod p-1 を求めるll x=0;{unordered_map<int,int> mp;ll now=0;for(int i=0;i<10000;i++){mp[now]=i;now+=k;if(now>=p-1)now-=p-1;}ll ap=e%(p-1);for(int i=0;i<100001;i++){if(mp.count(ap)){x=i*10000+mp[ap];break;}ap-=now;if(ap<0)ap+=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(){ios::sync_with_stdio(false);std::cin.tie(nullptr);ll t;cin >> t;while(t--){solve();}}