Submission #1253748

#TimeUsernameProblemLanguageResultExecution timeMemory
1253748HoriaHaivasNoM (RMI21_nom)C++20
100 / 100
163 ms39180 KiB
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long

using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int range_rng(int l, int r)
{
    return uniform_int_distribution<int>(l,r)(rng);
}

const int mod=1e9+7;
int fact[4005];
int invfact[4005];
int dp[4005][4005];

int lgpow(int x, int p)
{
    int ans,pw,i;
    ans=1;
    pw=x;
    for (i=0; i<=30; i++)
    {
        if (p&(1<<i))
            ans=(ans*pw)%mod;
        pw=(pw*pw)%mod;
    }
    return ans;
}

int invmod(int x)
{
    return lgpow(x,mod-2);
}

void precalc()
{
    int i;
    fact[0]=1;
    for (i=1; i<=4000; i++)
    {
        fact[i]=(fact[i-1]*i)%mod;
    }
    invfact[4000]=invmod(fact[4000]);
    for (i=3999; i>=0; i--)
    {
        invfact[i]=(invfact[i+1]*(i+1))%mod;
    }
}

int nCk(int n, int k)
{
    if (n<k)
        return 0;
    int ans;
    ans=fact[n];
    ans=(ans*invfact[k])%mod;
    ans=(ans*invfact[n-k])%mod;
    return ans;
}

signed main()
{
    //ifstream fin("linii.in");
    //ofstream fout("linii.out");
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,i,j,k,l,ans,nush,sum,x,oke;
    precalc();
    cin >> n >> m;
    dp[0][0]=1;
    sum=0;
    for (i=1; i<=m; i++)
    {
        nush=((2*n)/m)+((i-1)<=((2*n)%m));
        if (i==1)
            nush--;
        sum+=nush;
        for (j=0; j<=sum-nush; j++)
        {
            for (x=0; x<=min(j,nush); x++)
            {
                if ((j+nush-x*2)>=0)
                {
                    dp[i][j+nush-x*2]+=(((((dp[i-1][j]*nCk(nush,x))%mod)*nCk(j,x))%mod)*fact[x])%mod;
                    dp[i][j+nush-x*2]%=mod;
                }
            }
        }
    }
    oke=dp[m][0];
    oke=(oke*fact[n])%mod;
    oke=(oke*lgpow(2,n))%mod;
    cout << oke;
    return 0;
}
#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...