提出 #5074666


ソースコード 拡げる

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

const int64_t MOD = 998244353;
void add(int64_t& a, int64_t b){
    a = (a+b) % MOD;
}
void mul(int64_t& a, int64_t b){
    a = (a*b) % MOD;
}

vector<int64_t> fact, seq_inv, fact_inv;

void create_fact_mod(int num){
    fact[0] = 1;
    fact[1] = 1;
    for(int i=2; i<=num; i++){
        fact[i] = fact[i-1] * i % MOD;
    }
}

void create_seq_inv_mod(int num){
    seq_inv[0] = 1;
    seq_inv[1] = 1;
    for(int i=2; i<=num; i++){
        seq_inv[i] = (MOD - MOD/i) * seq_inv[MOD%i] % MOD;
    }
}

void create_fact_inv_mod(int num){
    fact_inv[0] = 1;
    fact_inv[1] = 1;
    for(int i=2; i<=num; i++){
        fact_inv[i] = fact_inv[i-1] * seq_inv[i] % MOD;
    }
}

void create_mod_tables(int num){
    fact.resize(num+1);
    seq_inv.resize(num+1);
    fact_inv.resize(num+1);
    create_fact_mod(num);
    create_seq_inv_mod(num);
    create_fact_inv_mod(num);
}

int64_t comb_mod(int n, int k){
    return fact[n] * fact_inv[n-k] % MOD * fact_inv[k] % MOD;
}

int64_t perm_mod(int n, int k){
    return fact[n] * fact_inv[n-k] % MOD;
}

int main(){
    int N, X;
    cin >> N >> X;
    create_mod_tables(6010);

    static int64_t dp[3001][6010], dp2[3001][6010];
    dp[0][0] = 1;
    dp2[0][0] = 1;
    for(int i=0; i<N; i++) for(int j=0; j<=2*N; j++){
        for(int k=0; k<=2; k++) add(dp[i+1][j+k], dp[i][j]);
        for(int k=1; k<=2; k++) add(dp2[i+1][j+k], dp2[i][j]);
    }
    int64_t ans = 0;
    for(int j=0; j<X; j++) add(ans, dp[N][j]);

    for(int y=1; X+y<=2*N; y+=2){
        if(y+1 < X-1){
            for(int n=1; n+y+1<=N; n++){
                int64_t result = dp2[n][X-y-2];
                mul(result, comb_mod(N, n+y+1));
                add(ans, result);
            }
        }else{
            if(X%2) add(ans, comb_mod(N, (X+y)/2));
        }
    }
    cout << ans << endl;
    return 0;
}

提出情報

提出日時
問題 F - Banned X
ユーザ betrue12
言語 C++14 (GCC 5.4.1)
得点 800
コード長 1964 Byte
結果 AC
実行時間 241 ms
メモリ 282112 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 800 / 800
結果
AC × 5
AC × 25
セット名 テストケース
Sample s1.txt, s2.txt, s3.txt, s4.txt, s5.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, s1.txt, s2.txt, s3.txt, s4.txt, s5.txt
ケース名 結果 実行時間 メモリ
01.txt AC 218 ms 282112 KiB
02.txt AC 218 ms 282112 KiB
03.txt AC 150 ms 215040 KiB
04.txt AC 207 ms 252160 KiB
05.txt AC 239 ms 268672 KiB
06.txt AC 241 ms 268672 KiB
07.txt AC 213 ms 254208 KiB
08.txt AC 224 ms 274816 KiB
09.txt AC 223 ms 281728 KiB
10.txt AC 159 ms 215040 KiB
11.txt AC 2 ms 2432 KiB
12.txt AC 2 ms 2432 KiB
13.txt AC 2 ms 2432 KiB
14.txt AC 2 ms 2432 KiB
15.txt AC 2 ms 2432 KiB
16.txt AC 218 ms 282112 KiB
17.txt AC 220 ms 281216 KiB
18.txt AC 211 ms 276864 KiB
19.txt AC 218 ms 282112 KiB
20.txt AC 33 ms 87168 KiB
s1.txt AC 2 ms 2432 KiB
s2.txt AC 2 ms 2432 KiB
s3.txt AC 2 ms 4480 KiB
s4.txt AC 2 ms 4480 KiB
s5.txt AC 10 ms 33536 KiB