けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 275 B - ABC-DEF (5Q, 灰色, 200 点)

mod 998244353 の練習!

問題概要

非負整数  A, B, C, D, E, F が与えられる。

 A \times B \times C - D \times E \times F を 998244353 で割った余りを求めよ。

制約

  •  0 \le A, B, C, D, E, F \le 10^{18}

考えたこと

「足し算・引き算・かけ算」をした計算結果を 998244353 で割った余りを求める方法論については、次の記事に詳しく書いた。

qiita.com

これを元にして、実装する。なお、注意点として、 A, B, C, D, E, F の値は最大で  10^{18} まであり得るので、あらかじめ 998244353 で割った余りに置き換えておくこととする。そうしないと、 A \times B などを計算するときにオーバーフローが発生してしまう。

コード

#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;

int main() {
    long long A, B, C, D, E, F;
    cin >> A >> B >> C >> D >> E >> F;
    
    // あらかじめ MOD をとっておく
    A %= MOD, B %= MOD, C %= MOD, D %= MOD, E %= MOD, F %= MOD;
    
    // ABC, DEF を計算
    long long ABC = (A * B % MOD) * C % MOD;
    long long DEF = (D * E % MOD) * F % MOD;
    
    // ABC - DEF を計算
    long long res = (ABC - DEF) % MOD;
    if (res < 0) res += MOD;
    cout << res << endl;
}