結果
| 問題 |
No.187 中華風 (Hard)
|
| コンテスト | |
| ユーザー |
uafr_cs
|
| 提出日時 | 2016-02-18 22:09:29 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,464 bytes |
| コンパイル時間 | 2,483 ms |
| コンパイル使用メモリ | 77,860 KB |
| 実行使用メモリ | 57,240 KB |
| 最終ジャッジ日時 | 2024-09-22 12:04:27 |
| 合計ジャッジ時間 | 15,295 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 WA * 1 |
ソースコード
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){
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; }
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];
}
}
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];
}
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 == 0 ? prod : ret);
}
}
}
uafr_cs