Submission #749930

#TimeUsernameProblemLanguageResultExecution timeMemory
749930TrunktyZapina (COCI20_zapina)C++14
110 / 110
426 ms3396 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll

int n,mod=1e9+7;
int comb[355][355];
int dp[355][355][2];

int dopow(int x, int y){
    if(y==0){
        return 1;
    }
    int z = dopow(x,y/2);
    if(y%2){
        return (((z*z)%mod)*x)%mod;
    }
    else{
        return (z*z)%mod;
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    for(int i=0;i<=n;i++){
        comb[i][0] = 1;
        for(int j=1;j<=i;j++){
            comb[i][j] = comb[i][j-1]*(i-j+1LL);
            comb[i][j] %= mod;
            comb[i][j] *= dopow(j,mod-2);
            comb[i][j] %= mod;
        }
    }
    dp[0][n][0] = 1;
    for(int i=0;i<=n-1;i++){
        for(int j=0;j<=n;j++){
            for(int k=0;k<=n;k++){
                if(j>=k){
                    dp[i+1][j-k][1] += dp[i][j][1]*comb[j][k];
                    dp[i+1][j-k][1] %= mod;
                    if(k==i+1){
                        dp[i+1][j-k][1] += dp[i][j][0]*comb[j][k];
                        dp[i+1][j-k][1] %= mod;
                    }
                    else{
                        dp[i+1][j-k][0] += dp[i][j][0]*comb[j][k];
                        dp[i+1][j-k][0] %= mod;
                    }
                }
            }
        }
    }
    cout << dp[n][0][1] << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...