답안 #898253

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
898253 2024-01-04T12:10:38 Z LucaIlie Festivals in JOI Kingdom 2 (JOI23_festival2) C++17
5 / 100
1 ms 440 KB
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 3000;
const int MAX_FACT = 2 * MAX_N;
int mod;
int fact[MAX_FACT + 1], invFact[MAX_FACT + 1], countB[MAX_N + 1], countBU[MAX_N + 1];

int lgPut( int x, int n ) {
    if ( n == 0 )
        return 1;

    int p = lgPut( x, n / 2 );
    p = (long long)p * p % mod;
    if ( n % 2 == 1 )
        p = (long long)p * x % mod;

    return p;
}

void initFact( int n ) {
    fact[0] = 1;
    for ( int i = 1; i <= n; i++ )
        fact[i] = (long long)fact[i - 1] * i % mod;
    invFact[n] = lgPut( fact[n], mod - 2 );
    for ( int i = n - 1; i >= 0; i-- )
        invFact[i] = (long long)invFact[i + 1] * (i + 1) % mod;
}

int comb( int n, int k ) {
    return (long long)fact[n] * invFact[n - k] % mod * invFact[k];
}

int prodCons( int x, int k ) {
    if ( x < 0 )
        return 1;
    if ( x == 0 )
        return fact[x + k - 1];
    return (long long)fact[x + k - 1] * invFact[x - 1] % mod;
}

int main() {
    int n;

    cin >> n >> mod;

    initFact( 2 * n );


    countB[2] = 1;
    countBU[1] = 1;
    for ( int i = 1; i <= n; i++ ) {
        //B<--B 1
        for ( int k = 0; i + k + 2 <= n; k++ )
            countB[i + k + 2] = (countB[i + k + 2] + (long long)countB[i] * comb( k + 2, 2 ) % mod * prodCons( 2 * i - 2, k ) % mod) % mod;

        //B<--B 2
        for ( int k = 0; i + k + 2 <= n; k++ )
            countB[i + k + 2] = (countB[i + k + 2] + (long long)countB[i] * comb( k + 2, 2 ) % mod * prodCons( 2 * i - 2, k ) % mod) % mod;

        //B<--BU
        for ( int k = 0; i + k + 2 <= n; k++ )
            countB[i + k + 2] = (countB[i + k + 2] + (long long)countBU[i] * (k + 1) % mod * prodCons( 2 * i - 1, k ) % mod) % mod;

        //BU<--B
        for ( int k = 0; i + k + 1 <= n; k++ )
            countBU[i + k + 1] = (countBU[i + k + 1] + (long long)countB[i] * (k + 1) % mod * prodCons( 2 * i - 2, k ) % mod) % mod;

        //BU<--BU
        for ( int k = 0; i + k + 1 <= n; k++ )
            countBU[i + k + 1] = (countBU[i + k + 1] + (long long)countBU[i] * prodCons( 2 * i - 1, k ) % mod) % mod;
    }

    int tot = 1;
    for ( int i = 3; i < 2 * n; i += 2 )
        tot = (long long)tot * i % mod;

    int correct = 0;
    for ( int i = 1; i <= n; i++ ) {
        int k = n - i;
        correct = (correct + (long long)countB[i] * (k + 1) % mod * prodCons( 2 * i - 2, k ) % mod) % mod;
        correct = (correct + (long long)countBU[i] * prodCons( 2 * i - 1, k ) % mod) % mod;
    }

    cout << (tot - correct + mod) % mod;

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 412 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 440 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 412 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 440 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 412 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 440 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 412 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 440 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 412 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 440 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 412 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 440 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -