Submission #643392

#TimeUsernameProblemLanguageResultExecution timeMemory
643392danikoynovNoM (RMI21_nom)C++14
100 / 100
220 ms63196 KiB
/**
 ____ ____ ____ ____ ____ ____
||l |||e |||i |||n |||a |||d ||
||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|

**/

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 2010;
const ll mod = 1e9 + 7;
int n, m;
ll dp[maxn][maxn], ch[maxn][maxn], t[maxn], f[maxn];
void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i ++)
    {
        int cnt = (2 * n - i) / m + 1;
        t[i] = cnt;

    }

    for (int i = 0; i <= max(n, m); i ++)
        ch[i][0] = 1;

    for (int i = 1; i <= max(n, m); i ++)
        for (int j = 1; j <= max(n, m); j ++)
        {
            ch[i][j] = ch[i - 1][j - 1] + ch[i - 1][j];
            if (ch[i][j] >= mod)
                ch[i][j] -= mod;
        }

    f[0] = 1;
    for (ll i = 1; i <= (ll)max(n, m); i ++)
    {
        f[i] = (f[i - 1] * i) % mod;
    }
    dp[0][0] = 1;
    for (int i = 0; i < m; i ++)
        for (int j = 0; j <= n; j ++)
        {
            for (int k = max((ll)(0), t[i + 1] - j); k <= t[i + 1]; k ++)
            {
                dp[i + 1][j + k - (t[i + 1] - k)] += (((((dp[i][j] * ch[j][t[i + 1] - k]) % mod) * ch[t[i + 1]][t[i + 1] - k]) % mod) * f[t[i + 1] - k]) % mod;
                ///cout << i << " " << j << " " << k << " " << i + 1 << " " << j + k - (t[i + 1] - k) << endl;
                if (dp[i + 1][j + k - (t[i + 1] - k)] >= mod)
                    dp[i + 1][j + k - (t[i + 1] - k)] -= mod;
            }
            ///cout << dp[i][j] << " ";
        }
    ///cout << dp[m][0] << endl;
    ll ans = dp[m][0];
    for (ll i = 1; i <= n; i ++)
        ans = (((ans * i) % mod) * (ll)(2)) % mod;


    cout << ans << endl;

}

int main()
{
    solve();
    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...