2020牛客国庆集训派对day3 I.Rooted Tree(哈代-拉马努金拆分数列)

题目

https://ac.nowcoder.com/acm/contest/7830/I

题意

给你n个点,问你最多可以生成多少个不同构的树。这个树的深度最多为2.

题解

首先我们暴力模拟一下情况。
n = 1 时 ans = 1
n = 2 时 ans = 1
n = 3 时 ans = 2
n = 4 时 ans = 3
n = 5 时 ans = 5
n = 6 时 ans = 7
n = 7 时 ans = 11
n = 8 时 ans = 15
n = 9 时 ans = 22
n = 10 时 ans = 30
n = 11 时 ans = 42
n = 12 时 ans = 56
n = 13 时 ans = 77.
肯定有人就会问了,请问你是怎么暴力的呢?
哈哈哈哈哈哈哈
那我说一下我手动暴力的方法把。
拿n = 8来举例。
首先需要一个点作为根节点,所以剩下的点为7个。
然后我们去分配7个点。
方法如下:

1 1 1 1 1 1 1(一个节点连接7个只有一个节点的点)
1 1 1 1 1 2(一个节点连接5个只有一个节点的点,和一个有2个节点的点)
1 1 1 1 3
1 1 1 2 2
1 1 1 4
1 1 2 3
1 2 2 2
1 1 5
1 2 4
1 3 3
2 2 3
1 6
2 5
3 4
7 (有7个节点的点)
http://blog.sina.com.cn/s/blog_71942ef00102zgd7.html

好了,接下来我们得到了这样的数列:
1 1 2 3 5 7 11 15 22 30 42 56 77 …
是不是完全看不出这样的数列有什么规律呢?
接下来科普一下哈代-拉马努金拆分数列
令T(0) = 1
T(1) = T(0) = 1;
T(2) = T(1) + T(0) = 2
T(3) = T(2) + T(1) = 3
T(4) = T(3) + T(2) = 5
T(5) = T(4) + T(3)-T(0) = 7
T(6) = T(5) + T(4)-T(1) = 11
T(7) = T(6) + T(5)-T(2)-T(0)= 15
T(8) = T(7) + T(6)-T(3)-T(1)= 22
T(9) = T(8) + T(7)-T(4)-T(2)= 30
T(10) = T(9) + T(8)-T(5)-T(3)= 42

公式来源:


那我们拿到了这个公式,可是这个公式有什么规律呢?
我们把公式减去的常数,形成一个新的数列:
1 2 5 7 12 15 22 26 35 40
既然是拆分数列,那么我们可以把这个数列拆分一下
f(x) = 1 5 12 22 35 …

g(x) = 2 7 15 36 40 …
先观察f(x),我们可以发现这是个每两个数的差值是公差为3等差数列
f(x)每两个数的差值4 7 10 13
再观察g(x),我们也可以发现这是个每两个数的差值是公差为3等差数列
g(x)每两个数的差值5 8 11 14
我们通过设一元二次方程就可以算出f(x)和g(x)的公式:
f[i] = (3* i2 - i) / 2;
g[i] = (3* i2 + i) / 2;
那么我们就可以写代码啦!

AC代码

#include <iostream>
using namespace std;
typedef long long ll;
const ll N = 500005, mod = 998244353;
ll f[N], g[N], dp[N];
int n;int main()
{scanf("%d", &n);--n;for (ll i = 1; i <= n; ++i) f[i] = i * (3*i - 1) / 2;for (ll i = 1; i <= n; ++i) g[i] = i * (3*i + 1) / 2;dp[0] = 1;for (int i = 1; i <= n; ++i){for (int j = 1; f[j] <= i; ++j){if (j % 2==1){dp[i] += dp[i - f[j]];if (g[j] <= i) dp[i] += dp[i - g[j]];}else{dp[i] -= dp[i - f[j]];if (g[j] <= i) dp[i] -= dp[i - g[j]];}}dp[i] %= mod;if (dp[i] < 0) dp[i] += mod;}printf("%lld\n", dp[n]);return 0;
}

2020牛客国庆集训派对day3 I.Rooted Tree(哈代-拉马努金拆分数列)相关推荐

  1. 2020牛客国庆集训派对day3 Leftbest

    Leftbest 链接:https://ac.nowcoder.com/acm/contest/7830/A 来源:牛客网 题目描述 Jack is worried about being singl ...

  2. 2020牛客国庆集训派对day3 Points

    Points 题目描述 Jack and Rose are playing games after working out so many difficult problems. They toget ...

  3. 2020牛客国庆集训派对day2 补题J

    2020牛客国庆集训派对day2 补题J:VIRUS OUTBREAK 题目描述 The State Veterinary Services Department recently reported ...

  4. 2020牛客国庆集训派对day2 H-STROOP EFFECT(英语题)

    2020牛客国庆集训派对day2 H-STROOP EFFECT(英语题) 题目 https://ac.nowcoder.com/acm/contest/7818/H 题意 这题目真的太难读懂了,赛后 ...

  5. 2020牛客国庆集训派对day8 G-Shuffle Cards(扩展STL容器,rope可持久化平衡树)

    2020牛客国庆集训派对day8 G-Shuffle Cards(扩展STL容器,rope可持久化平衡树) 题目 https://ac.nowcoder.com/acm/contest/7865/G ...

  6. 2020牛客国庆集训派对day1 A.ABB

    2020牛客国庆集训派对day1 A.ABB 题目链接 题目描述 Fernando was hired by the University of Waterloo to finish a develo ...

  7. 2020牛客国庆集训派对day2 F题 Java大数处理

    题目: 链接:https://ac.nowcoder.com/acm/contest/16913/F 来源:牛客网 The following code snippet calculates the ...

  8. 2020牛客国庆集训派对day8

    牛客网链接 文章目录 Easy Chess 题意: 题解: Easy Problemset 题意 题解: Shuffle Cards 题解: Diff-prime Pairs 题意 题解: 代码: E ...

  9. 2020牛客国庆集训派对day4 Arithmetic Progressions

    Arithmetic Progressions 链接:https://ac.nowcoder.com/acm/contest/7831/B 来源:牛客网 题目描述 An arithmetic prog ...

最新文章

  1. Shell 定时清理小脚本
  2. SQL注入——报错注入
  3. java卡片布局例子_Java编程使用卡片布局管理器示例【基于swing组件】
  4. linux课堂笔记(6)
  5. gabor 幅值域 matlab,组合局部多通道Gabor滤波器和ICA的人脸描述与识别
  6. Teamcenter 开发中的一些问题
  7. JavaScript正则表达式19例(7)
  8. 微信小程序开发流程、开发者工具下载安装
  9. 林子雨大数据软件安装和编程指南导航
  10. 存档修改 html,制作可以修改.rpgsave存档的网页
  11. Threejs实现模拟管道液体流动
  12. 坐标范围计算显示缩放级别zoom自适应显示地图
  13. android 各种服务介绍,Android 网络服务介绍
  14. 2021铜鼓中学高考成绩查询,厉害了铜鼓中学▶今年又创历史新高!赞赞赞!
  15. 极速进阶,小i智慧学堂联合复旦大学教授推出人工智能冬令营
  16. pandas随机抽取1000行
  17. 一位上海女生所经历过的N次感情,对80 90后的朋友具有深刻的教育意义。如果你真的看懂了,那么表示你可以真正开始谈恋爱了...
  18. 基于STM32的电子琴音乐播放器设计
  19. MediaStore.Images.Media.insertImage保存图片
  20. windows 8.1 安装

热门文章

  1. 内存池、进程池、线程池
  2. js拆字_分图程序 _拆分书法字体_拆分石刻碑文_拆分黄庭经碑文_使用方法
  3. 如何成为智能合约开发者
  4. 分析nginx access log日志的命令
  5. 计算机网络原理自考真题,自考计算机网络原理真题附标准标准答案.doc
  6. 【miscellaneous】星光级超低照度摄像机技术分析
  7. JAVA中FC什么意思_java – 位掩码的规则是什么?像0xFF vs. 0xFC
  8. 数字逻辑与数字系统设计——最大项与最小项表达式
  9. 罗斯蒙特流量计安装上的五大注意事项
  10. 王春亮推拿学堂:如何提高自己的能量级别