毕业_设计 2022-01-29 00:44 采纳率: 100%
浏览 45
已结题

用C++解决​堆的计数问题

​堆的计数
题目描述

我们知道包含N个元素的堆可以看成是一棵包含N个节点的完全二叉树。

每个节点有一个权值。对于小根堆来说,父节点的权值一定小于其子节点的权值。
假设N个节点的权值分别是1~N,你能求出一共有多少种不同的小根堆吗?
例如对于N=4有如下3种:

1

/
2 3
/
4

1

/
3 2
/
4

1

/
2 4
/
3

由于数量可能超过整型范围,你只需要输出结果除以1000000009的余数。

输入格式

一个整数N。

对于40%的数据,1 <= N <= 1000

对于70%的数据,1 <= N <= 10000

对于100%的数据,1 <= N <= 100000

输出格式

一个整数表示答案。

输入样例

4

输出样例

3

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 1000ms

  • 写回答

1条回答 默认 最新

  • 易小侠 C/C++领域新星创作者 2022-01-29 06:04
    关注
    
    #include <bits/stdc++.h>
    using namespace std;
     
    typedef long long ll;
    const int maxn = 100000;
    ll s[maxn + 10], dp[maxn + 10], inv[maxn + 10], f[maxn + 10];
    ll n;
    ll mod = 1000000009;
    ll qPow(ll a, ll b)
    {
        ll ans = 1;
        while (b != 0)
        {
            if (b & 1)
            {
                ans = ans * a % mod;
            }
            a = a * a % mod;
            b >>= 1;
        }
        return ans % mod;
    }
    ll C(ll n, ll m)
    {
        return (f[n] * inv[f[m]]) % mod * inv[f[n - m]] % mod;
    }
     
    int main()
    {
        cin >> n;
        f[0] = 1;
        for (int i = 1; i <= maxn; i++)
        {
            f[i] = (f[i - 1] * i) % mod;
            inv[i] = qPow(i, mod - 2);
        }
        for (int i = n; i >= 1; i--)
        {
            s[i] = (s[i * 2 + 1] <= n ? s[i * 2 + 1] : 0) + (s[i * 2] <= n ? s[i * 2] : 0) + 1;
        }
        for (int i = 1; i <= n; i++)
        {
            dp[i] = 1;
        }
        for (int i = n; i >= 1; i--)
        {
            if (i * 2 + 1 <= n)
            {
                dp[i] = (C(s[i] - 1, s[i * 2 + 1]) * dp[i * 2 + 1]) % mod * dp[i * 2] % mod;
            }
        }
        cout << dp[1] << endl;
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月30日
  • 已采纳回答 1月29日
  • 创建了问题 1月29日

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么