結果
問題 | No.187 中華風 (Hard) |
ユーザー | uafr_cs |
提出日時 | 2016-02-18 22:16:02 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 738 ms / 3,000 ms |
コード長 | 2,834 bytes |
コンパイル時間 | 2,349 ms |
コンパイル使用メモリ | 77,452 KB |
実行使用メモリ | 57,124 KB |
最終ジャッジ日時 | 2024-09-22 12:05:31 |
合計ジャッジ時間 | 15,677 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 199 ms
56,288 KB |
testcase_01 | AC | 207 ms
56,860 KB |
testcase_02 | AC | 699 ms
56,580 KB |
testcase_03 | AC | 697 ms
56,672 KB |
testcase_04 | AC | 738 ms
56,716 KB |
testcase_05 | AC | 732 ms
56,980 KB |
testcase_06 | AC | 737 ms
56,980 KB |
testcase_07 | AC | 738 ms
56,748 KB |
testcase_08 | AC | 539 ms
56,844 KB |
testcase_09 | AC | 544 ms
57,012 KB |
testcase_10 | AC | 536 ms
56,772 KB |
testcase_11 | AC | 736 ms
56,828 KB |
testcase_12 | AC | 736 ms
56,856 KB |
testcase_13 | AC | 318 ms
56,980 KB |
testcase_14 | AC | 335 ms
57,124 KB |
testcase_15 | AC | 662 ms
56,812 KB |
testcase_16 | AC | 675 ms
57,088 KB |
testcase_17 | AC | 133 ms
54,044 KB |
testcase_18 | AC | 204 ms
56,788 KB |
testcase_19 | AC | 134 ms
54,136 KB |
testcase_20 | AC | 622 ms
56,860 KB |
testcase_21 | AC | 136 ms
54,040 KB |
testcase_22 | AC | 736 ms
57,044 KB |
testcase_23 | AC | 133 ms
54,036 KB |
testcase_24 | AC | 135 ms
53,984 KB |
ソースコード
import java.util.Arrays; import java.util.Scanner; class Scratch { public static long mod_inv(long a, long m){ return (a == 1 ? 1 : (1 - m*mod_inv(m%a, a)) / a + m); } public static long gcd(long a, long b){ return b == 0 ? a : gcd(b, a % b); } public static boolean make_so(long[] as, long[] ms){ while(true) { boolean updated = false; for (int fst = 0; fst < ms.length; fst++) { for (int snd = fst + 1; snd < ms.length; snd++) { long gcd = gcd(ms[fst], ms[snd]); if (gcd == 1) { continue; } updated = true; if (as[fst] % gcd != as[snd] % gcd) { return false; } ms[fst] /= gcd; ms[snd] /= gcd; while (true) { long gt = gcd(ms[fst], gcd); if (gt == 1) { break; } ms[fst] *= gt; gcd /= gt; } ms[snd] *= gcd; as[fst] %= ms[fst]; as[snd] %= ms[snd]; } } if(!updated){ break; } } return true; } public static long chinese_remainder(long[] as, long[] ms){ long[] vs = new long[ms.length]; long[] sums = new long[ms.length]; long[] invs = new long[ms.length]; for(int i = 0; i < ms.length; i++){ invs[i] = 1; // mod(ms[i]) の中で 1 / (ms[0] * ms[1] ... ms[i - 1]) を求める sums[i] = as[i]; // mod(ms[i]) の中で, a[i] - v[0] - v[1]ms[0] ... を求める long mult = 1; // mod(ms[i]) の中で, ms[0] * ... * ms[i - 2] を求める for(int j = 0; j < i; j++){ sums[i] -= (vs[j] * mult) % ms[i]; if(sums[i] < 0){ sums[i] += ms[i]; } invs[i] = (invs[i] * mod_inv(ms[j], ms[i])) % ms[i]; mult = (mult * ms[j]) % ms[i]; } vs[i] = (sums[i] * invs[i]) % ms[i]; } boolean flg = true; for(int i = 0; i < ms.length; i++){ if(vs[i] != 0){ flg = false; break;} } if(flg){ long prod = 1; for(final long p : ms){ prod *= p; prod %= 1000000007; } return prod; } long ret = 0; for(int i = 0; i < ms.length; i++){ long mult = 1; for(int j = 0; j < i; j++){ mult *= ms[j]; mult %= 1000000007;}// ここで MOD が必要な場合は取る ret += vs[i] * mult;// ここで MOD が必要な場合は取る ret %= 1000000007; } return ret; } public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { final int N = sc.nextInt(); long[] as = new long[N]; long[] ms = new long[N]; for (int i = 0; i < N; i++){ as[i] = sc.nextLong(); ms[i] = sc.nextLong(); } final boolean so = make_so(as, ms); //System.out.println(Arrays.toString(as)); //System.out.println(Arrays.toString(ms)); if(!so){ System.out.println(-1); return; } long prod = 1; for(final long p : ms){ prod *= p; prod %= 1000000007; } final long ret = chinese_remainder(as, ms); System.out.println(ret); } } }