結果

問題 No.187 中華風 (Hard)
ユーザー GOTKAKOGOTKAKO
提出日時 2024-03-22 02:00:15
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,828 bytes
コンパイル時間 3,170 ms
コンパイル使用メモリ 207,532 KB
実行使用メモリ 6,676 KB
最終ジャッジ日時 2024-03-22 02:00:22
合計ジャッジ時間 5,419 ms
ジャッジサーバーID
(参考情報)
judge14 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
6,676 KB
testcase_01 AC 3 ms
6,676 KB
testcase_02 WA -
testcase_03 AC 116 ms
6,676 KB
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 106 ms
6,676 KB
testcase_16 AC 107 ms
6,676 KB
testcase_17 AC 2 ms
6,676 KB
testcase_18 AC 2 ms
6,676 KB
testcase_19 AC 2 ms
6,676 KB
testcase_20 WA -
testcase_21 AC 2 ms
6,676 KB
testcase_22 WA -
testcase_23 WA -
testcase_24 AC 2 ms
6,676 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

long long PreGarner(vector<long long> &B,vector<long long> &M,long long MOD){
    long long ret = 1;
    for(int i=0; i<B.size(); i++) for(int k=i+1; k<B.size(); k++){
        long long g = gcd(M.at(i),M.at(k));
        if(B.at(i)%g != B.at(k)%g) return -1;
        M.at(i) /= g; M.at(k) /= g;
        long long g1 = gcd(M.at(i),g),g2 = g/g1;
        while(true){
            g = gcd(g1,g2);
            if(g == 1) break;
            g1 *= g; g2 /= g;
        } 
        M.at(i) *= g1,M.at(k) *= g2;
        B.at(i) %= M.at(i),B.at(k) %= M.at(k);
    }
    for(auto &m : M) ret = ret*m%MOD;
    return ret; //return lcm(m1,m2,...,mn).
}
long long extgcd(long long a, long long b, long long &x,long long &y){
    if(b == 0){x = 1,y = 0; return a;}
    long long g = extgcd(b,a%b,y,x);
    y -= a/b*x; return g;
}
long long findinv(long long a,long long m){
    long long x,y; extgcd(a,m,x,y);
    return (x%m+m)%m;    
}
long long Garner(vector<long long> &B,vector<long long> &M,long long MOD){
    M.push_back(MOD);
    vector<long long> mulM(M.size(),1),value(M.size(),0);
    for(int i=0; i<B.size(); i++){
        long long t = (((B.at(i)-value.at(i))*findinv(mulM.at(i),M.at(i)))%M.at(i)+M.at(i))%M.at(i);
        for(int k=i+1; k<M.size(); k++){
            value.at(k) = (value.at(k)+t*mulM.at(k))%M.at(k);
            mulM.at(k) = mulM.at(i)*M.at(i)%M.at(k);
        }
    }
    return value.back();
}

int main(){
    int N; cin >> N;
    vector<long long> B,M;
    bool allzero = true;
    while(N--){
        int b,m; cin >> b >> m;
        if(b) allzero = false;
        B.push_back(b); M.push_back(m);
    }
    long long mod = 1e9+7;
    long long lcm = PreGarner(B,M,mod);
    if(lcm == -1 || allzero) cout << lcm << endl;
    else cout << Garner(B,M,mod) << endl;
}
0