結果
問題 |
No.981 一般冪乗根
|
ユーザー |
|
提出日時 | 2020-02-01 04:05:06 |
言語 | Java (openjdk 23) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,958 bytes |
コンパイル時間 | 2,533 ms |
コンパイル使用メモリ | 79,768 KB |
実行使用メモリ | 65,332 KB |
最終ジャッジ日時 | 2024-10-09 14:02:05 |
合計ジャッジ時間 | 17,673 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | TLE * 1 -- * 43 |
ソースコード
import java.util.*; import java.io.*; class Main { public static void main(String[] args) throws Exception { new Main().run(); } void run() { Scanner sc = new Scanner(System.in); int T=sc.nextInt(); for(int i=0;i<T;++i){ long p=sc.nextLong(); long k=sc.nextLong(); long a=sc.nextLong(); long root = kth_root(a,k,p); System.out.println(root); } } long kth_root(long a,long k,long p){ long g=gcd(k,p-1); if(pow(a,(p-1)/g,p)!=1)return -1; long root=primitiveRoot(p); long y=log(a,root,p); long z=inv(k/g,(p-1)/g)*(y/g)%(p-1); return pow(root,z,p); } // a=g^x mod p long log(long a,long g,long p){ int v=(int)Math.sqrt(p)+1; //g^{qv+r}=a HashMap<Long,Integer> map=new HashMap<>(); long mul=1; for(int r=0;r<=v;++r){ map.put(mul,r); mul=mul*g%p; } long g2=pow(inv(g,p),v,p); mul=1; for(int q=0;q<=v;++q){ if(map.containsKey(a*mul%p)){ return (q*v%(p-1)+map.get(a*mul%p))%(p-1); } mul=mul*g2%p; } throw new AssertionError(); } long primitiveRoot(long p){ for(long i=1;i<p;++i){ if(isPrimitiveRoot(i,p))return i; } throw new AssertionError(); } boolean isPrimitiveRoot(long a,long p){ boolean ret=true; for(long div=2;div*div<=p-1;++div){ ret&=pow(a,div,p)!=1; ret&=pow(a,(p-1)/div,p)!=1; if(!ret)return false; } return true; } int cnt(long a,long base,long p){ int ret=0; while(a!=1){ a=pow(a,base,p); ++ret; } return ret; } long inv(long a,long p){ a%=p; long u=1,v=0; long b=p; while(b>0) { long q=a/b; a%=b; u-=v*q%p; u%=p; { u^=v;v^=u;u^=v; a^=b;b^=a;a^=b; } } return (u%p+p)%p; } long pow(long a,long n,long p){ n%=p-1; long r=1; for(;n>0;n>>=1,a=a*a%p)if(n%2==1)r=r*a%p; return r; } long gcd(long a,long b) { return a==0?b:gcd(b%a,a); } static void tr(Object... objects) { System.out.println(Arrays.deepToString(objects)); } }