题目描述

  幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对。
  所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子。神奇的节点对则是指白色节点对。
  请问对于深度为$n$的斐波那契树,其中距离为$i$的神奇节点对有多少个?拉比艾尔需要你对于$1\leqslant i\leqslant 2n$的所有$i$都求出答案。


输入格式

一行一个正整数$n$。


输出格式

一行$2n$个整数表示答案,对$123456789$取模。


样例

样例输入:

5

样例输出:

0 2 3 3 1 1 1 0 0 0 0


数据范围与提示

对于$20\%$的数据$n\leqslant 10$;
对于$40\%$的数据$n\leqslant 20$;
对于$60\%$的数据$n\leqslant 30$;
对于$80\%$的数据$n\leqslant 400$;
对于$100\%$的数据$n\leqslant 5,000$。


题解

先来看一下这棵树:

首先,来看几点性质:

  $\alpha.$每一行的点数呈斐波那契数列。

  $\beta.$从第二行开始,每行的黑点个数呈斐波那契数列。

  $\gamma.$从第三行开始,每行的白点个数呈斐波那契数列。

  $\delta.$对于每一个黑(白)点,如果它有一棵深度为$k$的子树,那么所有这些子树都是一样的。

得到了这些性质,再来看这道题:

设$w[i]$表示第$i$行的白点的个数,$b[i]$表示第$i$行黑点的个数,$sw[i]$表示小于等于$i$行的所有白点的个数,$sb[i]$表示小于等于$i$行的所有黑点的个数(注意此处的行数其实也是深度,根节点的深度为$1$)。

思考如何计数,根据性质$\delta$,可以考虑将每一棵不同的子树内部贡献,再乘上这样子树的数量即可得到答案。

再来考虑如何统计子树内部的贡献,可以大致分为两种情况:

  $\alpha.$神奇节点对的$LCA$为白色点。

  $\beta.$神奇节点对的$LCA$为黑色点。

观察上面的图可知,对于情况$\alpha$,$LCA$一定是其中一个白点,就是说这两个白点一定是祖先和后代的关系。

那么,对于一个深度为$k$的子树,其贡献为$w[i+1]$(因为祖先白点的行数是$1$),而这样的子树有$sw[n-i]$棵。

所以,对于情况$\alpha$,其对答案的贡献即为:

$$\sum \limits_{i=1}^n sw[n-i]\times w[i+1]$$

对于情况$\beta$,就显得麻烦很多了,两个白点必须在这个黑点($LCA$)的两个子节点的子树中。

考虑枚举两侧的距这个黑点的距离$i,j$(白色子节点的子树中的白点的距离为$i$,黑色子节点的子树中的白点的距离为$j$),并将这棵树进行如下图所示划分:

惊喜的发现,如果将右侧树的根节点由黑变白对答案没有影响,而右侧树就变成了一棵深度为$j+1$的普通树,那么其距离为$j$的白点就有$w[j+1]$个。

左侧深度为$i+1$,则对于左侧树其深度为$i$,所以距离为$i$的白点个数为$w[i]$。

那么对于这棵树,其对答案的贡献就是$w[i]\times w[j+1]$,而这样的子树的数量取决与$i,j$中更大的那一个,所以这样的子树有$sb[n-\max(i,j)]$棵。

所以,对于情况$\beta$,其对答案的贡献即为:

$$\sum \limits_{i=1}^n \sum \limits_{j=1}^n sb[n-\max(i,j)]\times w[i]\times w[j+1]$$

时间复杂度:$\Theta(n^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const int mod=123456789;
int n;
long long w[5001],b[5001],sw[5001],sb[5001];
long long ans[10001];
int main()
{
scanf("%d",&n);
w[1]=w[3]=1;
sw[1]=sw[2]=1;sw[3]=2;
for(int i=4;i<=n;i++)
{
w[i]=(w[i-1]+w[i-2])%mod;
sw[i]=(sw[i-1]+w[i])%mod;
}
b[2]=1;sb[2]=1;
for(int i=3;i<=n;i++)
{
b[i]=(b[i-1]+b[i-2])%mod;
sb[i]=(sb[i-1]+b[i])%mod;
}
for(int i=1;i<=n;i++)
ans[i]=sw[n-i]*w[i+1]%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans[i+j]=(ans[i+j]+sb[n-max(i,j)]*w[i]%mod*w[j+1])%mod;
for(int i=1;i<=2*n;i++)printf("%lld ",ans[i]);
return 0;
}

rp++

[CSP-S模拟测试]:幻魔皇(数学)的更多相关文章

  1. [CSP-S模拟测试]:不等式(数学)

    题目描述 小$z$热衷于数学.今天数学课的内容是解不等式:$L\leqslant S\times x\leqslant R$.小$z$心想这也太简单了,不禁陷入了深深的思考:假如已知$L,R,S,M$ ...

  2. [CSP-S模拟测试]:A(数学)

    题目传送门(内部题44) 输入格式 一行四个整数,分别表示$S,T,a,b$. 输出格式 输出最小步数,数据保证有解. 样例 样例输入: 10 28 4 2 样例输出: 数据范围与提示 样例解释: 先 ...

  3. [CSP-S模拟测试]:装饰(数学)

    题目传送门(内部题147) 输入格式 每个测试点第一行一个正整数$T$,表示该测试点内的数据组数. 接下来$T$行,每行三个非负整数$a,b,c$,含义如题目中所示. 输出格式 对每组数据输出一行一个 ...

  4. [CSP-S模拟测试]:最大值(数学+线段树)

    题目背景 $Maxtir$最喜欢最大值. 题目传送门(内部题128) 输入格式 第$1$行输入四个正整数$n,m,q$. 第$2$至$n+1$行中,第$i+1$行输入魔法晶石$i$的三种属性$(x_i ...

  5. [CSP-S模拟测试]:求和(数学)

    题目传送门(内部题107) 输入格式 一行五个正整数$x_1,y_1,x_2,y_2,m$ 输出格式 输出一个整数,为所求的答案对$m$取模后的结果. 样例 样例输入: 2 1 5 3 10007 样 ...

  6. [CSP-S模拟测试]:数列(数学)

    题目传送门(内部题95) 输入格式 第一行三个整数$n,a,b$,第二行$n$个整数$x_1\sim x_n$表示数列. 输出格式 一行一个整数表示答案.无解输出$-1$. 样例 样例输入:2 2 3 ...

  7. [CSP-S模拟测试]:Walker(数学)

    题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...

  8. [CSP-S模拟测试]:Six(数学)

    题目传送门(内部题85) 输入格式 一个正整数$N$. 输出格式 一个数表示答案对$1000000007$取模后的结果 样例 样例输入1: 样例输出1: 样例输入2: 样例输出2: 样例输入3: 样例 ...

  9. [CSP-S模拟测试]:Smooth(数学)

    题目传送门(内部题84) 输入格式 两个整数$B,K$ 输出格式 一个整数表示答案 样例 样例输入: 5 100 样例输出: 数据范围与提示 对于$40\%$的数据,保证答案小于$10^7$对于另$2 ...

随机推荐

  1. Centos7 yum安装LNMP

    1.Centos7系统库中默认是没有nginx的rpn包的,所以我们需要先更新下rpm依赖库 (1):使用yum安装nginx,安装nginx库 rpm -Uvh http://nginx.org/p ...

  2. Django使用Celery进行异步任务

    Celery Celery是一个功能完备即插即用的异步任务队列系统.它适用于异步处理问题,当发送邮件.或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用 ...

  3. 1、Java语言概述与开发环境——编译和运行第一个程序HelloWorld.java

    编写一个Java程序到运行的步骤概述: 1.将Java代码编写到扩展名为.Java的文件中 2.通过Javac命令对该Java文件进行编译 3.通过Java命令对生成的class文件进行运行 一.编写 ...

  4. You-Get,多网站视频下载工具,非常方便

    You-Get是一个非常优秀的网站视频下载工具.使用You-Get可以很轻松的下载到网络上的视频.图片及音乐. 按Win+R键打开运行,输入cmd,再输入命令 pip install you-get, ...

  5. nginx启动报错

    nginx启动的时候报错 nginx: [emerg] invalid number of arguments in "root" directive in /etc/nginx/ ...

  6. mysql之sql性能调优

    sql调优大致分为两步:1 如何定位慢查询   2 如何优化sql语句. 一:定位慢查询 -- 显示到mysql数据库的连接数 -- show status like 'connections'; - ...

  7. django部署到linux上不显示.svg图标处理方法

    在setting文件的最开始添加如下内容: import mimetypes mimetypes.add_type("image/svg+xml", ".svg" ...

  8. Animator通过按键切换动画不及时,动画延时切换问题

    再unity3D版本为Unity 5.2.1f1 (64-bit),再设置动画切换时有一个Has Exit Time属性,由于勾上了这个的原因

  9. npm学习(一)之安装、更新以及管理npm版本

    安装npm 安装前须知: npm是在Node中编写的,因此需要安装Node.js才能使用npm.可以通过Node.js网站安装npm,或者安装节点版本管理器NVM. 如果只是想开始探索npm,使用No ...

  10. HTML第一课(前期知识准备)

    在正式的学习之前,我们先了解一些前端方面的常识. 一.前端是做什么? 如果有认真看过我写的预备程序员不得不知道的事儿这篇文章的同学应该清楚,前端的工作在整个项目开发中处于代码编写阶段,主要是用来做界面 ...