結果
問題 | No.181 A↑↑N mod M |
ユーザー | ぴろず |
提出日時 | 2015-04-03 21:18:00 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 164 ms / 5,000 ms |
コード長 | 2,204 bytes |
コンパイル時間 | 3,186 ms |
コンパイル使用メモリ | 79,388 KB |
実行使用メモリ | 41,608 KB |
最終ジャッジ日時 | 2024-11-24 03:09:18 |
合計ジャッジ時間 | 9,744 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 126 ms
41,100 KB |
testcase_01 | AC | 124 ms
41,332 KB |
testcase_02 | AC | 130 ms
41,076 KB |
testcase_03 | AC | 125 ms
40,848 KB |
testcase_04 | AC | 129 ms
41,164 KB |
testcase_05 | AC | 129 ms
41,252 KB |
testcase_06 | AC | 128 ms
41,112 KB |
testcase_07 | AC | 129 ms
41,168 KB |
testcase_08 | AC | 125 ms
41,608 KB |
testcase_09 | AC | 128 ms
41,544 KB |
testcase_10 | AC | 127 ms
41,352 KB |
testcase_11 | AC | 121 ms
41,156 KB |
testcase_12 | AC | 128 ms
41,056 KB |
testcase_13 | AC | 125 ms
41,332 KB |
testcase_14 | AC | 127 ms
41,480 KB |
testcase_15 | AC | 128 ms
41,608 KB |
testcase_16 | AC | 130 ms
41,584 KB |
testcase_17 | AC | 125 ms
41,536 KB |
testcase_18 | AC | 107 ms
39,736 KB |
testcase_19 | AC | 113 ms
39,796 KB |
testcase_20 | AC | 126 ms
41,436 KB |
testcase_21 | AC | 126 ms
41,144 KB |
testcase_22 | AC | 129 ms
41,156 KB |
testcase_23 | AC | 124 ms
40,936 KB |
testcase_24 | AC | 128 ms
41,144 KB |
testcase_25 | AC | 132 ms
41,056 KB |
testcase_26 | AC | 125 ms
41,456 KB |
testcase_27 | AC | 126 ms
41,480 KB |
testcase_28 | AC | 114 ms
39,820 KB |
testcase_29 | AC | 128 ms
41,416 KB |
testcase_30 | AC | 116 ms
40,020 KB |
testcase_31 | AC | 164 ms
41,268 KB |
testcase_32 | AC | 126 ms
41,108 KB |
testcase_33 | AC | 113 ms
39,656 KB |
testcase_34 | AC | 118 ms
41,152 KB |
testcase_35 | AC | 121 ms
41,416 KB |
testcase_36 | AC | 123 ms
41,200 KB |
testcase_37 | AC | 111 ms
39,812 KB |
testcase_38 | AC | 124 ms
41,100 KB |
testcase_39 | AC | 125 ms
41,288 KB |
testcase_40 | AC | 126 ms
41,176 KB |
testcase_41 | AC | 121 ms
41,156 KB |
testcase_42 | AC | 119 ms
41,532 KB |
ソースコード
package tetration; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println(solve(sc.nextInt(),sc.nextInt(),sc.nextInt())); } static final int M_MAX = 2010; static int bmax = 0; static ArrayList<Long> hyper4Small; static int[] memo = new int[M_MAX]; //周期の計算用 public static long solve(long a,long b,long m) { if (a == 1) { return 1 % m; } /* * 小さいbに対して、hyper4(a,b)を愚直に計算する。 * hyper4(a,b) < M_MAXとなる最大のb,bmaxを求める。 * a = 1の場合そのようなbは存在しないのであらかじめ弾く。 */ hyper4Small = new ArrayList<>(); hyper4Small.add(1L); LOOP: for(int i=1;;i++) { long x = 1; long exponent = hyper4Small.get(i-1); for(int j=0;j<exponent;j++) { x *= a; if (x >= M_MAX) { break LOOP; } } hyper4Small.add(x); } bmax = hyper4Small.size() - 1; return hyper4Mod(a, b, m); } public static long hyper4Mod(long a,long b,long m) { //自明なケース if (m == 1) { return 0; } if (b == 0) { return 1; } if (b - 1 <= bmax) { //hyper4(a,b-1) <= M_MAX と同じ //前計算を用いる return powMod(a, hyper4Small.get((int)b-1) , m); }else{ //powmodの周期性を用いる long c = cycle(a,m); return powMod(a, M_MAX + mod((hyper4Mod(a, b-1, c) - M_MAX), c), m); } } /** * 1,a,a^2,a^3,... (mod m) がループする周期を求める。 * 例えばa=2,m=28のとき、 * 1,2,4,8,16,4,8,16,... * で返り値は3となる。 */ public static long cycle(long a,long m) { Arrays.fill(memo, -1); long x = powMod(a,M_MAX,m); for(int i=0;;i++) { int j = memo[(int) x]; if (j >= 0) { return i - j; } memo[(int) x] = i; x = x * a % m; } } public static long powMod(long x,long n,long mod) { long res = 1; while(n > 0) { if ((n & 1) > 0) { res = (res * x) % mod; } x = (x * x) % mod; n/=2; } return res; } public static long mod(long x,long m) { x %= m; if (x < 0) { x += m; } return x; } }