【NOIP2017提高组模拟12.10】幻魔皇

题目

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

分析


我们找一找每层黑点和白点的规律
|层数|白点数|黑点数|
|:-|:---|:----|
|1|1|0|
|2|0|1|
|3|1|1|
|4|1|2|
|5|2|3|
|......|
又发现一棵以白点为根的子树和原树结构一样,
一棵以黑点为根的子树和从第二层开始原树结构一样,
预处理出每层黑白点的个数,个数前缀和以及每层黑白点的个数,个数前缀和。
那么假设神奇点对的lca为白点,那么lca一定是点对中的一个点(观察结构得出),
枚举距离为i,那么个数就是一颗以白点为根的子树第i+1层的白点个数,乘以有多少个这样的子树。
同样,假设神奇点对的lca为黑点,
枚举两个点到达lca的距离分别为i和j,那么个数就是一颗以黑点为根的子树第i+1层的白点个数,乘以一颗以黑点为根的子树第i+1层的白点个数,乘以有多少个这样的子树。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const long long mo=123456789;
const int N=5005;
using namespace std;
long long w[N],sum[N],n,ans[N*2],b[N],sum1[N];
int main()
{
    scanf("%lld",&n);
    w[1]=1;
    w[2]=0;
    w[3]=1;
    for(int i=4;i<=n;i++) w[i]=(w[i-1]+w[i-2])%mo;
    for(int i=1;i<=n;i++) sum[i]=(sum[i-1]+w[i])%mo;
    b[1]=0;
    b[2]=1;
    for(int i=3;i<=n;i++) b[i]=(b[i-1]+b[i-2])%mo;
    for(int i=1;i<=n;i++) sum1[i]=(sum1[i-1]+b[i])%mo;
    for(int i=1;i<=n;i++)
        ans[i]=sum[n-i]*w[i+1]%mo;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            ans[i+j]=(ans[i+j]+sum1[n-max(i,j)]*w[i]%mo*w[j+1]%mo)%mo;
        }
    for(int i=1;i<=n*2;i++) printf("%lld ",ans[i]);
}

原文地址:https://www.cnblogs.com/chen1352/p/9066607.html

时间: 2024-07-30 10:36:59

【NOIP2017提高组模拟12.10】幻魔皇的相关文章

【NOIP2017提高组模拟12.10】神炎皇

题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)=d,a'd=a,b'd=b\) 那么\(a'+b'|a'b'd\) 因为\(gcd(a',b')=1\) 所以\(a'+b'|d\). 又因为\((a'+b')d<=n\) 则\(a'+b'=\sqrt n\) 枚举\(a'+b'=i\) \(d就有\dfrac{n}{i^2}种情况\) 因为\(gcd

计蒜客NOIP2017提高组模拟赛(五)day1-展览

传送门 发现这题选或不选对状态的优劣程度不会产生影响,如果已经确定了两个数a和b,那么最优的首项和公比也都是唯一确定的, 与对于后面的数x,加进去也好不加进去也好,首项和公比依旧是原来的 于是我们用尺取算法,用两个指针来扫一遍, 如果只有一个数且下一个数能被整除,就加进去,然后确定首项和公比 如果只有一个数且下一个数不能整除,两个指针直接指向下一个数 如果有多个数且下一个数满足公式,就加进来 如果有多个数且下一个数不满足公式,两个指针直接指向下一个数 这样对于最优解,一定是可以找到的 顺便说下最

ZROI提高组模拟赛05总结

ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生生把一个弱智题变成了一个不可做题 最后竟然在转化两次后的模型上以为自己做出来了 这个题比别人多花的1h左右的时间,而且只得到了30分,成为了这场比赛失败的关键因素 T2 依旧是一道简单题 有人20min之内就A掉了 感觉放在CF里最多算一道Div2 D,还是简单的那种 可是我又一次想复杂了 大意就是

提高组模拟赛总结(1)

T1 : 题意:给定一个连续的颜色序列,至多可以去掉k种颜色,问能得到的最大连续单个颜色长度是多少 n <= 10 ^ 5 做法:考试的时候十分斯波,在统计的时候写了线段树统计,实际上根本不用 维护了两个指针表示当前的序列,离散化后用桶维护每一个颜色的数量,如果颜色 <= k + 1就一直加颜色进来,不然就一直移动左指针删除颜色,每次改变某一颜色数量时更新一下最大值就好了 T2: 题意:(实在没办法总结一句话题意了ORZ,总之是个变种的Lis)有 n 个节目,其描述了在 Ti时 刻 Xi号社团

[SinGuLaRiTy] NOIP2017 提高组

[SinGuLaRiTy-1048] Copyright (c) SinGuLaRiTy 2018. All Rights Reserved. NOIP2017过了这么久,现在2018了才找到寒假这么一个空挡来写题解.哎,没办法,谁叫学校抓的紧呢. 序 | Before 这是我的最后一次NOIP. 因为是最后一次的原因吧,考前压力就蛮大的,再加上各种模拟赛,模板练习的轮番轰炸,走进考场时整个人都是“飘飘欲仙”的感觉~ 我的NOIP2017就在这种“飘飘欲仙”的氛围下开始了. 游记 | Blogs

NOIP2017提高组-滚粗记

这次是真的滚粗了 感觉自己被欺骗了 本来还以为自己一等应该可以的,但是如今事实就这么摆着,想哭也没有用了 DAY -1:在机房里整理了些模板,担心这个要考又担心那个要考 DAY 0:早上又看了会儿模板,中午就出发了,差不多晚上5点多到的帝京(酒店好像还不错噢),过了一会儿就出发去衢二中领证吃饭了,晚上回来就在房间里面颓废,睡得也挺晚的 DAY 1:早上6点被闹钟叫醒,8:30考试,还有点小紧张,T1看了好久一直不会,找了几个样例后发现好像有规律但是又找不到,挺急的!后来不知道怎么就感觉找到规律了

2014-10-18 noip提高组模拟赛(codecomb)[未填]

> <看了一下觉得挺难的...除了T2 T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下!) T2贪心..很容易看出的 T3感觉题目没有怎么看懂...> <正解居然是树形dp 果然不太会 T4蒟蒻> <我连最小子矩阵都不会求T_T其他更不用说了 虽然没有参加比赛,但感觉自己到不了200(hzwer说没有200应该去参加普及组QAQ) 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 而且T1以为是

提高组模拟赛总结(3)

貌似是tyvj 2012年的题? T1:给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K . 现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少? 刚看到题目,歪歪斜斜的每页上都写着'水题'几个字.我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满本都写着一个字是'坑'!" 显然

[NOIp2017提高组]小凯的疑惑

题目大意: 给你两个数a,b,保证a与b互质,求最大的x满足不能被表示成若干个a与b的和. 思路: 据说是小学奥数题. 考场上先写了个a*b的60分DP,然后打表发现答案就是(a-1)*(b-1)-1. 1 #include<cstdio> 2 #include<cctype> 3 typedef long long int64; 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar()));