Submission #574382

#TimeUsernameProblemLanguageResultExecution timeMemory
574382uroskNoM (RMI21_nom)C++14
100 / 100
394 ms117556 KiB
#define here cerr<<"===========================================\n"
#include <bits/stdc++.h>
#define ld double
#define ll long long
#define llinf 100000000000000000LL // 10^17
#define pb push_back
#define popb pop_back
#define fi first
#define sc second
#define endl '\n'
#define pll pair<ll,ll>
#define pld pair<ld,ld>
#define sz(a) (ll)(a.size())
#define all(a) a.begin(),a.end()
#define ceri(a,l,r) {for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;}
#define daj_mi_malo_vremena ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0);

using namespace std;
#define mod 1000000007
#define maxn 4005
ll n,m;
ll fact[maxn];
ll add(ll x,ll y){
    x+=y;
    if(x<0){
        x%=mod;
        x+=mod;
    }else{
        if(x>=mod) x%=mod;
    }
    return x;
}
ll mul(ll a,ll b){
	ll ans = (a*b)%mod;
	if(ans<0) ans+=mod;
	return ans;
}
ll mul(vector<ll> v){
    if(sz(v)==1) return v[0];
    if(sz(v)==0) return 1LL;
    ll ans = 1;
    for(ll x : v) ans = mul(ans,x);
    return ans;
}
ll po(ll x,ll y){
    if(y==0) return 1LL;
    if(y==1) return x;
    ll ans = po(x,y/2);
    ans = mul(ans,ans);
    if(y&1) ans = mul(ans,x);
    return ans;
}
ll inv(ll x){return po(x,mod-2);}
ll bin[maxn][maxn];
ll ch(ll x,ll y){
    if(x<y) return 0;
    return bin[x][y];
}
ll f(ll i){
    if((i&1)) return 1;
    return -1;
}
ll dp[maxn][maxn];
ll rem[maxn];
int main(){
	daj_mi_malo_vremena
	for(ll i = 1;i<maxn;i++) bin[i][0] = bin[i][i] = 1;
	for(ll i = 1;i<maxn;i++){
        for(ll j = 1;j<i;j++){
            bin[i][j] = add(bin[i-1][j],bin[i-1][j-1]);
        }
	}
    fact[0] = 1;
    for(ll i = 1;i<=maxn-1;i++) fact[i] = mul(fact[i-1],i);
    cin >> n >> m;
    for(ll i = 1;i<=2*n;i++) rem[i%m]++;
    rem[m] = rem[0];
    dp[0][0] = 1;
    for(ll i = 1;i<=m;i++){
        ll ni = rem[i];
        for(ll j = 0;j<=n;j++){
            for(ll k = 0;2*k<=ni&&j>=k;k++){
                dp[i][j] = add(dp[i][j],mul({dp[i-1][j-k],ch(ni,k),ch(ni-k,k),fact[k]}));
            }
        }
    }
    ll ans = 0;
    for(ll i = 1;i<=n;i++) ans = add(ans,mul({ch(n,i),fact[2*n-2*i],dp[m][i],fact[i],f(i)}));
    ans = add(fact[2*n],-ans);
    cout<<ans<<endl;
	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...