Submission #1353726

#TimeUsernameProblemLanguageResultExecution timeMemory
1353726Francisco_MartinLego Wall (EGOI22_legowall)C++20
100 / 100
554 ms15916 KiB
//EGOI 2022 Lego Wall
//https://qoj.ac/contest/2259/problem/5179

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
const ll MAXN = 5e5+5;
const ll MOD = 1e9+7;

vll f(MAXN,1), fi(MAXN);
ll binpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=(res*a)%MOD;
        a=(a*a)%MOD; b/=2;
    }
    return res;
}
void setup(){
    for(int i=1; i<MAXN; i++) f[i]=(f[i-1]*i)%MOD;
    fi[MAXN-1]=binpow(f[MAXN-1],MOD-2);
    for(int i=MAXN-2; i>=0; i--) fi[i]=(fi[i+1]*(i+1))%MOD;
}
ll binom(ll a,ll b){return ((f[a]*fi[b])%MOD*fi[a-b])%MOD;}

int main(){
    ll n, m, ans=0; setup();
    cin >> n >> m;
    if(m<n){
        vll dp(m+1,0); dp[m]=1;
        for(int i=2; i<=n; i++){
            vll ndp(m+1,0);
            for(int x=0; x<m; x++) for(int y=m-x; y<=m; y++){
                ndp[x]=(ndp[x]+dp[y]*binom(y,m-x))%MOD;
            }
            swap(dp,ndp);
        }
        for(int i=0; i<=m; i++) ans=(ans+dp[i])%MOD;
    }else{
        vll fib(n+1,0), dp(n+1,1); vector<vll> tot(n+1,vll(m+1,1)); fib[0]=1; fib[1]=2;
        for(int i=2; i<=n; i++) fib[i]=(fib[i-1]+fib[i-2])%MOD;
        for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) tot[i][j]=(tot[i][j-1]*fib[i-1])%MOD;
        for(int i=2; i<=n; i++){
            dp[i]=tot[i][m];
            for(int j=1; j<i; j++) dp[i]=(dp[i]-(dp[j]*tot[i-j][m])%MOD+MOD)%MOD;
        }
        ans=dp[n];
    }
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...