제출 #963017

#제출 시각아이디문제언어결과실행 시간메모리
963017Ghetto캥거루 (CEOI16_kangaroo)C++17
100 / 100
37 ms31732 KiB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
const int MAX_N = 2e3 + 5;
const lint MOD = 1e9 + 7;

int n;
int s, f;

lint mod(lint x) {
    return x % MOD;
}

lint dp[MAX_N][MAX_N];
void do_dp() {
    dp[1][1] = 1;
    for (int i = 1; i < n; i++) {
        for (int c = 1; c <= n; c++) {
            if ((i + 1) == s || (i + 1) == f) {
                dp[i + 1][c + 1] = mod(dp[i + 1][c + 1] + dp[i][c]);
                dp[i + 1][c] = mod(dp[i + 1][c] + dp[i][c]);
                continue;
            }

            lint mult = c + 1;
            mult -= (bool) (i + 1 > s);
            mult -= (bool) (i + 1 > f);
            
            dp[i + 1][c + 1] = mod(dp[i + 1][c + 1] + mod(dp[i][c] * mult));
            dp[i + 1][c - 1] = mod(dp[i + 1][c - 1] + mod(dp[i][c] * (c - 1)));
        }
    }
}

int main() {
    // freopen("kangaroo.in", "r", stdin);

    cin >> n >> s >> f;
    if (s > f) swap(s, f);

    do_dp();
    cout << dp[n][1] << '\n';

    // for (int i = 1; i <= n; i++) 
    //     for (int c = 1; c <= n; c++)
    //         cout << i << " " << c << ": " << dp[i][c] << endl;
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...