結果

問題 No.186 中華風 (Easy)
ユーザー maguro
提出日時 2021-03-12 21:11:06
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,970 bytes
コンパイル時間 1,967 ms
コンパイル使用メモリ 195,980 KB
最終ジャッジ日時 2025-01-19 13:56:57
ジャッジサーバーID
(参考情報)
judge3 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 21 WA * 2
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int Inf = 1000000030;
constexpr ll INF= 2000000000000000001;
constexpr ll MOD = 998244353;
const double PI = 3.1415926535897;
typedef pair<ll,ll> P;
typedef pair<ll,P> PP;

template<class T> inline bool chmax(T &a, T b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}

template<class T> inline bool chmin(T &a, T b) {
    if (a > b) {
        a = b;
        return 1;
    }
    return 0;
}

ll mod(ll val, ll M) {
    val = val % M;
    if(val < 0) {
        val += M;
    }
    return val;
}

template<typename T>

T RS(T N, T P, T M){
    if(P == 0) {
        return 1;
    }
    if(P < 0) {
        return 0;
    }
    if(P % 2 == 0){
        ll t = RS(N, P/2, M);
        if(M == -1) return t * t;
        return t * t % M;
    }
    if(M == -1) {
        return N * RS(N,P - 1,M);
    }
    return N * RS(N, P-1, M) % M;
}

//extgcd(a,b,x,y):ax+by=gcd(a,b)を満たす(x,y)が格納される 返り値はgcd(a,b)
ll extgcd(ll a,ll b,ll &x,ll &y) {
    if(b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll d = extgcd(b,a % b,y,x);
    y -= a / b * x;
    return d;
}

//CRT(b,m):n次合同方程式を解く。答えは x = retr(mod retm)の形で表される(解が無い場合は(0,-1)の形で表される)
pair<ll,ll> CRT(vector<ll> b,vector<ll> m) {
    ll retr = 0;
    ll retm = 1;
    for(int i = 0;i < (int)b.size();i++) {
        ll x,y;
        ll d = extgcd(retm,m.at(i),x,y);
        if((b.at(i) - retr) % d != 0) return make_pair(0,-1);
        ll tmp = (b.at(i) - retr) / d * x % (m.at(i) / d);
        retr += retm * tmp;
        retm *= m.at(i) / d;
    }
    return make_pair(mod(retr,retm),retm);
}


int main() {
    ll X1,Y1,X2,Y2,X3,Y3;
    cin >> X1 >> Y1 >> X2 >> Y2 >> X3 >> Y3;
    pair<ll,ll> ret = CRT({X1,X2,X3},{Y1,Y2,Y3});
    if(ret.second == -1) cout << -1 << endl;
    else cout << ret.first << endl;
}
0