結果

問題 No.2356 Back Door Tour in Four Seasons
ユーザー 👑 AngrySadEightAngrySadEight
提出日時 2023-04-08 11:47:18
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,085 bytes
コンパイル時間 879 ms
コンパイル使用メモリ 79,580 KB
実行使用メモリ 6,824 KB
最終ジャッジ日時 2024-11-15 23:41:59
合計ジャッジ時間 8,170 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 6 ms
5,248 KB
testcase_01 AC 6 ms
5,248 KB
testcase_02 AC 6 ms
5,248 KB
testcase_03 AC 6 ms
5,248 KB
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 AC 6 ms
6,820 KB
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
testcase_27 RE -
testcase_28 AC 6 ms
6,816 KB
testcase_29 AC 6 ms
6,816 KB
testcase_30 AC 117 ms
6,820 KB
testcase_31 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;

ll mod2 = 998244353;

ll my_pow(ll x, ll n, ll mod){
    // 繰り返し二乗法.x^nをmodで割った余り.
    ll ret;
    if (n == 0){
        ret = 1;
    }
    else if (n % 2 == 1){
        ret = (x * my_pow((x * x) % mod, n / 2, mod)) % mod;
    }
    else{
        ret = my_pow((x * x) % mod, n / 2, mod);
    }
    return ret;
}

int main(){
    ll N;
    cin >> N;
    vector<char> S(N);
    vector<ll> A(N);
    ll all_sum = 0;
    ll spring = 0;
    for (ll i = 0; i < N; i++){
        cin >> S[i] >> A[i];
        all_sum += A[i];
        if (S[i] == 'P') spring++;
    }
    vector<ll> summer(201, 0);
    vector<ll> fall(201, 0);
    vector<ll> winter(201, 0);
    for (ll i = 0; i < N; i++){
        if (S[i] == 'U') summer[A[i]]++;
        if (S[i] == 'F') fall[A[i]]++;
        if (S[i] == 'W') winter[A[i]]++;
    }
    vector<ll> pow_1(202, 0);
    vector<ll> pow_2(202, 0);
    vector<ll> pow_3(606, 0);
    for (ll i = 0; i <= 200; i++){
        pow_1[i] = my_pow(N - 1, i, mod2);
        pow_2[i] = my_pow(N - 2, i, mod2);
    }
    for (ll i = 0; i <= 600; i++){
        if (i <= all_sum) pow_3[i] = my_pow(N - 1, all_sum - i, mod2);
    }
    ll ans = 0;
    for (ll i = 1; i <= 200; i++){
        for (ll j = 1; j <= 200; j++){
            for (ll k = 1; k <= 200; k++){
                if (summer[i] == 0 || fall[j] == 0 || winter[k] == 0) continue;
                ll prod = 1;
                prod = (prod * ((pow_1[i] - pow_2[i] + mod2) % mod2)) % mod2;
                prod = (prod * ((pow_1[j] - pow_2[j] + mod2) % mod2)) % mod2;
                prod = (prod * ((pow_1[k] - pow_2[k] + mod2) % mod2)) % mod2;
                prod = (prod * pow_3[i + j + k]) % mod2;
                prod = (prod * summer[i]) % mod2;
                prod = (prod * fall[j]) % mod2;
                prod = (prod * winter[k]) % mod2;
                prod = (prod * spring) % mod2;
                ans = (ans + prod) % mod2;
            }
        }
    }
    cout << ans << endl;
    
}
0