2018icpc瀋陽熱身賽C
阿新 • • 發佈:2018-12-16
列舉當前這些數字中比第一個數字大的有多少
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll dp[35][1005]; ll C[35][35]; const ll mod = 1e9 + 7; ll dfs(int n, int m) { //cout << n << ' ' << m << endl; if (n <= 0 || m <= 0) return 0; if (dp[n][m] != -1) { return dp[n][m]; } if (m < n) return dp[n][m] = 0; if (m > n * (n + 1) / 2) return dp[n][m] = 0; ll &ans = dp[n][m]; ans = 0; ans = (dfs(n - 1, m - n) * 2) % mod; for (int i = 1; i <= n - 2; i++) { for (int j = 1; j <= m - n - 1; j++) { ll ans1 = dfs(i, j); ll ans2 = dfs(n - i - 1, m - j - n); if (!ans1 || !ans2) continue; ans = (ans + C[n - 1][i] * ans1 % mod * ans2 % mod) % mod; } } return ans; } int main() { memset(dp, -1, sizeof(dp)); C[0][0] = 1; for (int i = 1; i <= 30; i++) { C[i][0] = 1; for (int j = 1; j <= 30; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod; } int n, m; dp[1][1] = 1; while (scanf("%d%d", &n, &m) == 2) { printf("%lld\n", dfs(n, m)); } return 0; }