he12

导航

P7278 纯洁憧憬

#include <bits/stdc++.h>
using namespace std;
const int N = 400;
const int mod = 1e9 + 7;
int n,k;
int fac[N + 5];
int f[N + 5],g[N + 5];
int F[N + 5][N + 5],G[N + 5][N + 5];
int ans;
int main()
{
    scanf("%d%d",&n,&k),fac[0] = 1;
    for(register int i = 1;i <= n;++i)
        fac[i] = (long long)fac[i - 1] * i % mod;
    for(register int i = 1;i <= n;++i)
    {
        g[i] = fac[i];
        for(register int j = 1;j < i;++j)
            g[i] = (g[i] - (long long)g[j] * fac[i - j] % mod + mod) % mod;
    }
    G[0][0] = 1;
    for(register int i = 1;i <= n;++i)
        for(register int j = 1;j <= i;++j)
            for(register int x = 1;x <= i;++x)
                G[i][j] = (G[i][j] + (long long)G[i - x][j - 1] * fac[x]) % mod;
    f[1] = 1,f[2] = 2;
    for(register int i = 3;i <= n;++i)
    {
        f[i] = fac[i];
        for(register int j = 1;j < i;++j)
            f[i] = (f[i] - 2LL * g[j] * fac[i - j] % mod + mod) % mod;
        for(register int j = 4;j < i;++j)
            f[i] = (f[i] - (long long)f[j] * G[i][j] % mod + mod) % mod;
    }
    F[0][0] = 1;
    for(register int i = 1;i <= n;++i)
        for(register int j = 1;j <= i;++j)
            for(register int x = 1;x <= min(i,k);++x)
                F[i][j] = (F[i][j] + (long long)F[i - x][j - 1] * fac[x]) % mod;
    for(register int i = n - k;i <= k;++i)
        for(register int j = n - k;j <= n - i;++j)
            ans = (ans + 2LL * g[i] * g[j] % mod * fac[n - i - j]) % mod;
    for(register int i = 4;i <= n;++i)
        ans = (ans + (long long)f[i] * F[n][i]) % mod;
    ans = (fac[n] - ans + mod) % mod;
    printf("%d\n",ans);
}

posted on 2022-09-03 18:01  heyuchen  阅读(29)  评论(0)    收藏  举报