#include <bits/stdc++.h>
#define FastIO ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define pii pair<int,int>
#define ll long long int
#define SIZE 500005
#define all(v) v.begin(), v.end()
#define pb push_back
#define MOD 1000000007
#define INF 1000000007
using namespace std;
ll C[44][805] , D[44][805] , comb[888][888] , inv[888] , fact[888];
ll POW(ll x , ll y) {
if (y == 0) return 1;
if (y == 1) return x%MOD;
ll t = POW(x , y/2);
if (y%2 == 1) return ((t*t%MOD)*x)%MOD;
else return t*t%MOD;
}
int main() {
FastIO;
int N , M;
cin >> N;
comb[0][0] = inv[0] = fact[0] = 1;
for (int i = 1; i < 888; i++) {
comb[i][0] = 1;
fact[i] = (fact[i-1]*i)%MOD;
for (int j = 1; j <= i; j++) comb[i][j] = (comb[i-1][j-1]+comb[i-1][j])%MOD;
inv[i] = POW(fact[i] , MOD-2);
}
C[1][0] = 1; D[1][0] = 1;
for (int n = 2; n <= N; n++) {
M = n*(n-1)/2;
for (int k = n-1; k <= M; k++) {
for (int i = 1; i <= n-1; i++) {
for (int j = 0; j <= k-1; j++) {
ll ret = (comb[n-1][i-1]*comb[k-1][j])%MOD;
ret *= D[i][j]; ret %= MOD;
ret *= D[n-i][k-j-1]; ret %= MOD;
ret *= i; ret %= MOD;
ret *= (n-i); ret %= MOD;
C[n][k] += ret; C[n][k] %= MOD;
}
}
D[n][k] = C[n][k];
D[n][k] += ((M-(k-1))*D[n][k-1])%MOD; D[n][k] %= MOD;
// // printf("%d %d : %lld %lld\n" , n , k , C[n][k] , D[n][k]);
}
}
ll ans=0;
for (int k = 0; k <= M; k++) {
ll ret = (C[N][k]*fact[M-k])%MOD;
ret *= inv[M]; ret %= MOD;
ret *= k; ret %= MOD;
ans += ret; ans %= MOD;
}
cout << ans;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |