本题和 [96.不同的二叉搜索树](https://www.programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html) 比较像 * 取模这里很容易出错 * 过程中所用到的数值都有可能超过int,所以要改用longlong ```CPP #include #include using namespace std; long long mod = 1e9 + 7; long long dp(int t, vector& memory) { if (t % 2 == 0) return 0; if (t == 1) return 1; if (memory[t] != -1) return memory[t]; long long result = 0; // 枚举左右子树节点的数量 for (int i = 1; i < t; i += 2) { long long leftNum = dp(i, memory); // 左子树节点数量为i long long rightNum = dp(t - i - 1, memory); // 右子树节点数量为t - i - 1 result += (leftNum * rightNum) % mod; // 注意这里是乘的关系 result %= mod; } memory[t] = result; return result; } int main() { int n; cin >> n; vector memory(n + 1, -1); cout << dp(n, memory) << endl; } ``` ```CPP #include #include #include using namespace std; const int MOD = 1000000007; int main() { int num; cin >> num; if (num % 2 == 0) { cout << 0 << endl; return 0; } vector dp(num + 1, 0); dp[1] = 1; for (int i = 3; i <= num; i += 2) { for (int j = 1; j <= i - 2; j += 2) { dp[i] = (dp[i] + dp[j] * dp[i - 1 - j]) % MOD; } } cout << dp[num] << endl; return 0; } ``` 第二题的代码 #include using namespace std; long fastexp(long base,long n,long mod){ long answer = 1; while(n > 0){ if(n % 2 == 1){ answer = (answer * base) % mod; } base = (base * base) % mod; n /= 2; } return answer; } int kawaiiStrings(int n) { // write code here std::vector f(n + 1), g(n + 1), h(n + 1); long mod = 1000000007; for (long i = 2; i <= n; i++) g[i] = (g[i - 1] * 2 + (i - 1) * fastexp(2,i-2,mod)) % mod; for (long i = 3; i <= n; i++) f[i] = ((f[i - 1] * 3) % mod + g[i - 1]) % mod; for (long i = 3; i <= n; i++) h[i] = (fastexp(3, i - 3, mod) + h[i - 1] * 3 - h[i - 3]) % mod; return (f[n]-h[n]+mod)%mod; } int main(){ int n; cin >> n; cout << kawaiiStrings(n) << endl; return 0; }