题目描述



题解

虫合

由于前几天被教♂育了,所以大力找了一发规律

先把m-1,设f[i][j]表示m≤i,有j个叶子节点的答案

转移显然,也显然是O(n^3)的


把f打出来后长这样:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192

1 1 2 5 13 34 89 233 610 1597 4181 10946 28657 75025 196418

1 1 2 5 14 41 122 365 1094 3281 9842 29525 88574 265721 797162

1 1 2 5 14 42 131 417 1341 4334 14041 45542 147798 479779 1557649

1 1 2 5 14 42 132 428 1416 4744 16016 54320 184736 629280 2145600

1 1 2 5 14 42 132 429 1429 4846 16645 57686 201158 704420 2473785

1 1 2 5 14 42 132 429 1430 4861 16778 58598 206516 732825 2613834

1 1 2 5 14 42 132 429 1430 4862 16795 58766 207783 740924 2660139

1 1 2 5 14 42 132 429 1430 4862 16796 58785 207990 742626 2671892

1 1 2 5 14 42 132 429 1430 4862 16796 58786 208011 742876 2674117

1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742899 2674414

1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674439

1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440

1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440

显然第i行的前i+1个是正常的卡特兰数,从i+2项开始就不同了

可以发现:

\(f[1][i]=f[1][i-1]*1\)

\(f[2][i]=f[2][i-1]*2\)

\(f[3][i]=f[3][i-1]*3-f[3][i-2]*1\)

\(f[4][i]=f[4][i-1]*4-f[4][i-2]*6\)

\(f[5][i]=f[5][i-1]*5-f[5][i-2]*10+f[5][i-3]*1\)

猜想:

\(f[i][j]=\sum{f[i][j-k]*a[i][k]}\)

通过暴力枚举后可以把前几项的a搞出来:

1:1

2:2

3:3 -1

4:4 -3

5:5 -6 1

6:6 -10 4

7:7 -15 10 -1

8:8 -21 20 -5

钦定\(a[1...m][0]=1,a[1][1]=1,a[2][1]=2\)之后,可以发现一个神奇的式子:

\(a[i][j]=a[i-1][j]+a[i-2][j-1]\)

于是可以推出\(a[m]\),再推出\(f[m]\)即可

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define mod 998244353
using namespace std; long long a[5001][5001];
long long f[5001];
int n,m,i,j,k,l; int main()
{
freopen("ca.in","r",stdin);
freopen("ca.out","w",stdout);
// freopen("a.out","w",stdout); fo(i,1,5000)
a[i][0]=1;
a[1][1]=1;
a[2][1]=2;
fo(i,3,5000)
{
fo(j,1,5000)
a[i][j]=(a[i-1][j]+a[i-2][j-1])%mod;
} scanf("%d%d",&m,&n);
--m;
f[1]=1;
fo(i,2,m+1)
{
fo(j,1,i-1)
f[i]=(f[i]+f[j]*f[i-j]%mod)%mod;
} fo(i,m+2,n)
{
k=1;
fd(j,i-1,1)
{
f[i]=(f[i]+f[j]*a[m][i-j]*k%mod)%mod;
k=-k;
}
} fo(i,1,n)
printf("%lld\n",(f[i]+mod)%mod); fclose(stdin);
fclose(stdout); return 0;
}

官方题解

其实也不难,设\(f[i][j]\)表示放了i个点,从根到当前点需要向左走j步

那么\(f[i][j]\)可以走到自己的左儿子,或是走到最后一个向左走的那个点的右儿子,即\(f[i][j]-->f[i+1][j+1],f[i+1][j-1]\)

这样转移的本质是按dfs序走,最后的答案为\(f[2k-1][0]\)(最后一个点必定只能向右走)

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define mod 998244353
#define min(a,b) (a<b?a:b)
using namespace std; int f[10001][5002];
int n,m,i,j,k,l; int main()
{
freopen("ca.in","r",stdin);
freopen("ca.out","w",stdout); scanf("%d%d",&m,&n);--m;
f[1][0]=1; fo(i,1,n+n-2)
{
fd(j,min(m,i-1),0)
if (f[i][j])
{
f[i+1][j+1]=(f[i+1][j+1]+f[i][j])%mod;
if (j>0)
f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mod;
}
} for (i=1; i<=n+n-1; i+=2)
printf("%d\n",f[i][0]); fclose(stdin);
fclose(stdout); return 0;
}

6353. 【NOIP2019模拟】给(ca)的更多相关文章

  1. test20190815 NOIP2019 模拟题

    100+60+40=200,被后面两个题卡着我很不爽. 立方数 [问题描述] 作为 XX 战队的狂热粉丝,MdZzZZ 看到了自己心仪的队伍在半决赛落败,顿时 心灰意冷.看着自己手中的从黄牛那里抢来的 ...

  2. test20190814 NOIP2019 模拟题

    二叉树 [问题描述] 从前有一棵二叉树,我们用如下方式来表示这棵二叉树. 如果一个节点没有儿子,我们用"0"来表示他. 如果一个节点有一个儿子,我们对它的表示以"1&qu ...

  3. 6423. 【NOIP2019模拟11.11】画

    题目描述 Description Input Output Sample Input 3 2 3 3 6 5 1 2 1 3 Sample Output 15 Data Constraint 题解 迫 ...

  4. 【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)

    Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N ...

  5. [JZOJ6353] 【NOIP2019模拟】给

    题目 题目大意 对于所有的整数\(k \in [1,n]\),求叶子结点有\(k\)个的二叉树个数,满足每个非叶子结点都有两个儿子,并且对于每个叶子结点,从根节点到它经过的向左的边数少于等于\(m\) ...

  6. test20190827 NOIP2019 模拟赛

    100+100+50=250.最后那道期望题需要用另外的方式统计. 精灵加护 ljss 被 M 个敌人打倒在地上啦!每个敌人有一个威力值 bi.但是他手中还拥有 N 把武器!每把武器有一个威力值 ai ...

  7. test20190826 NOIP2019 模拟赛

    100+100+40=240.我觉得如果没做过第三题考场上却能想出来的都是神仙. 基因突变 [问题描述] 邪恶的 707 刚刚从白垩纪穿越回来,心中产生了一个念头:我要统治人类! 但是统治人类是很庞大 ...

  8. test20190818 NOIP2019 模拟赛

    0+0+20=20,不给大样例,小数据又水,还没有题解的垃圾题. A 题 问题描述: long long ago, Lxhgww 统治的国家里有 n 个城市,其中某一个城市是 capital (首都) ...

  9. test20190816 NOIP2019 模拟赛

    100+100+20=220,T3吐槽:整个考室没有一个人正确地理解了题意. 树上路径(phantasm) Akari 的学校的校门前生长着一排 n 棵树,从西向东依次编号为 1 ∼ n.相邻两棵树间 ...

随机推荐

  1. windows,oracle,dg报错:ORA-12528,ORA-12154,ORA-10456 ,PING[ARC1]: Heartbeat failed to connect to standby 'orclbk'. Error is 12154

    windows,oracle,dg报错:ORA-12528,ORA-12154,ORA-10456 最近有需求在windows的2台oracle服务器上搭建dg,在过程中遇到了一些错误,跟在linux ...

  2. 用matplotlib对数据可视化

    下图是要用到的数据集,反映了从1984到2016年的失业率的变化 1.导入可视化模块import matlibplot.pyplot as plt, 函数plt.plot(x, y)确定折线图的点,x ...

  3. vue防止 由于网速出现 闪现{{}}

    防止闪现可能应为网速的原因{{msg}} 一直解析不了, 于是用户就看到它了,不友好, 于是 vue推出 与css配合 [v-cloak] {display:none}

  4. 基于 @Scheduled 注解的 ----定时任务

    最常用的方法@Scheduled 注解表示起开定时任务 依赖 <dependencies> <dependency> <groupId>org.springfram ...

  5. 前端 CSS的选择器

    什么是选择器.在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式,某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素之后就可以为它们设置样式了. 选 ...

  6. 安装Linux系统CentOS6.5

    个人机器搭建分布式环境时避免要使用虚拟机来满足分布式环境所需的机器,当然伪分布式除外. 简单记录下虚拟机环境的创建过程,Mac上常用的虚拟机VMware Fusion. 虚拟机资源库中新建虚拟机: 选 ...

  7. CVE-2016-8655,af_packet Linux 內核通殺提權漏洞淺析

    簡單寫一下思路 這個東西需要namespace方面的支援, 首先open socket , 一連串路徑(packet_set_ring()->init_prb_bdqc()->prb_se ...

  8. 二: Jvm内存模型

    因为每个对象生命周期不一样,jvm在做内存管理的时候,就帮我们分成了三个区域: 1.  新生代(回收频率高)   新生和老年默认大小比例为1:2 2.  老年代(回收频率低)     最好所有的对象都 ...

  9. luogu P5338 [TJOI2019]甲苯先生的滚榜

    传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个 ...

  10. 锋利的JS解读——认识JQuery(一)

    一.jQuery的发展 随着javascript的不断发展,延伸出了多种JS程序库,当前比较流行的js库有:1)Prototype  成型较早,从整体上对面向对象的编程思想把握的不是很到位. 2)Do ...