jzoj2755-[2012东莞市选]树的计数【dp,高精度】

正题

题目链接:https://jzoj.net/senior/#main/show/2755


题目大意

求有多少个nnn个点直径为ddd的标号树。


解题思路

定义fi,jf_{i,j}fi,j表示iii个点,深度不超过jjj的标号树数量。

然后有转移fi,j=∑k=1i−1Ci−2k−1∗k∗fk,j−1∗fi−k,jf_{i,j}=\sum_{k=1}^{i-1}C_{i-2}^{k-1}*k*f_{k,j-1}*f_{i-k,j}fi,j=k=1i1Ci2k1kfk,j1fik,j

然后对于输入,我们考虑根节点就是直径经过的点,那么我们分为两种情况讨论

  1. ddd是奇数,这个我们枚举两个树拼接在一起然后其它的点瞎连接即可
  2. ddd是偶数,将两棵树拼接在一起即可,那么答案为fn,d/2−fn,d/2+1?f_{n,d/2}-f_{n,d/2+1}?fn,d/2fn,d/2+1?我们发现会有不合法情况,把不合法情况减去就好了

要高精度


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=51,P=1e6;
struct BNN{ll a[N],siz;
}ans,c[N][N],f[N][N],tmp;
BNN operator+(BNN a,BNN b){for(ll i=0;i<N;i++){a.a[i]=a.a[i]+b.a[i];a.a[i+1]+=a.a[i]/P;a.a[i]%=P;if(a.a[i])a.siz=i;}return a;
}
BNN operator-(BNN a,BNN b){for(ll i=0;i<N;i++){a.a[i]=a.a[i]-b.a[i];while(a.a[i]<0){a.a[i+1]--;a.a[i]+=P;}if(a.a[i])a.siz=i;}return a;
}
BNN operator*(BNN a,BNN b){BNN c;memset(c.a,0,sizeof(c.a));for(ll i=0;i<=a.siz;i++)for(ll j=0;j<=b.siz;j++)c.a[i+j]+=a.a[i]*b.a[j];c.siz=0;for(ll i=0;i<N;i++){c.a[i+1]+=c.a[i]/P;c.a[i]%=P;if(c.a[i])c.siz=i;}return c;
}
void write(BNN x){ll w=N-1;while(w&&!x.a[--w]);printf("%lld",x.a[w]);while((--w)>=0){if(x.a[w]<1e5)putchar('0');if(x.a[w]<1e4)putchar('0');if(x.a[w]<1e3)putchar('0');if(x.a[w]<1e2)putchar('0');if(x.a[w]<1e1)putchar('0');printf("%lld",x.a[w]);}putchar('\n');
}
int main()
{c[0][0].a[0]=1;for(ll i=1;i<N;i++){c[i][0].a[0]=1;for(ll j=1;j<=i;j++)c[i][j]=c[i-1][j]+c[i-1][j-1];}for(ll i=0;i<N;i++)f[1][i].a[0]=1;for(ll n=2;n<N;n++)	for(ll d=1;d<N;d++){if(d>=n) {f[n][d]=f[n][d-1];continue;}for(ll i=1;i<n;i++){tmp.a[0]=i;f[n][d]=f[n][d]+(c[n-2][i-1]*tmp*f[i][d-1]*f[n-i][d]);n++;n--; }}ll n,d;while(scanf("%lld%lld",&n,&d)!=EOF){ll r=d/2;if(n==d){printf("0\n");continue;}if(!d){printf("%lld\n",(n==1));continue;}if(!r){printf("%lld\n",(n==2));continue;}memset(ans.a,0,sizeof(ans.a));ans.siz=0;if(d&1){for(ll i=r;i<n;i++){ll j=n-2-i;if(j<r) continue;ans=ans+((f[i+1][r]-f[i+1][r-1])*(f[j+1][r]-f[j+1][r-1])*c[n-2][i]);}ans=ans*c[n][2];}else{ans=f[n][r]-f[n][r-1];if(r>=2){for(ll i=r;i<=n-1;i++){tmp.a[0]=i;ans=ans-(tmp*(f[i][r-1]-f[i][r-2])*c[n-1][i]*f[n-i][r-1]);}}tmp.a[0]=n;ans=ans*tmp;}write(ans);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2、异步HTTP编程

1、处理异步结果 在内部&#xff0c;play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器&#xff0c;这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展&…

【动态规划】最大子矩阵之和

最大子矩阵 Description 给出一个N [2<N<100]&#xff0c;并给出一个N*N的矩阵&#xff0c;矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。 比如&#xff1a; 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 和最大的子矩阵应该是这个&#xff1a; 9 2 …

3、play中的模板引擎

1、模板格式 Play默认的模板引擎是一种基于scala的安全模板引擎&#xff0c;尽管模板引擎使用Scala作为表达式语言&#xff0c;但是非常简单易学。参数类型使用后缀语法指定&#xff08;例如&#xff1a; id&#xff1a;Long&#xff09;&#xff0c;泛型类型是使用[]符号&…

jzoj3500-物语【最短路】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/0 题目大意 nnn个点mmm条边的无向图&#xff0c;有一条边的边权会变化&#xff0c;qqq次变化&#xff0c;每次询问最短路。 解题思路 可变边(x,y)(x,y)(x,y) 路径无非就三种 1−>n1->n1−>n1−>x−>…

Problem G. Graph 2015-2016 acmicpc neerc 拓扑排序模拟

一道好题 题目详见题目连接G graph 显然模拟拓扑排序的步骤是必不可少了。 假设我们当前有t个点&#xff0c;他们的入度均为0.我们不知道该选取哪一个。 我们把这t个点按从小到大排好序&#xff08;放入小顶堆&#xff09;&#xff0c;假设我们目前有k条边&#xff08;k &l…

【动态规划】石子合并

石子合并石子合并石子合并 Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。…

.NET Core调用WCF的最佳实践

现在.NET Core貌似很火&#xff0c;与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样。但是冷静背后我们要也看到.NET Core目前还有太多不足&#xff0c;别的不多说&#xff0c;与自家的服务框架WCF集成起来就不咋地&#xff0c;从最初不支持&#xff0c;到现在有…

4、表单提交和验证

1、启用/禁用表单module sbt启动应用时默认就启用了表单&#xff0c;也可以在build.sbt中添加启用libraryDependencies javaForms&#xff0c;想要移除表单时使用PlayMinimalJava 插件 2、play接收表单数据 play.data中的类可用于处理HTTP表单数据提交和验证&#xff0c;操…

Boring Homework 二叉搜索树的打印,模拟

写了好长时间&#xff0c;注意递归的使用&#xff0c;思路一定要清晰。 还有注意的地方&#xff1a;打印的时候一定要先打印到缓存buffer中&#xff0c;然后再输出到屏幕上面。 #include <bits/stdc.h> using namespace std; int idx 0; int val[100],lft[100],rgt[100…

jzoj3501-消息传递【换根法,树形dp】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/1 题目大意 一棵树&#xff0c;一个信息开始给一个人&#xff0c;每次得到信息的人可以选择相邻节点中的一个传递&#xff0c;求最短多久可以传到所有人。 解题思路 我们先考虑如何求一根的答案&#xff0c;farif…

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…

5、play中的json数据处理

1、play中的json库 Play使用Jackson JSON库将对象转换为JSON和JSON之间的对象。play的操作使用JsonNode类型&#xff0c;play.libs.json包中有操作json数据的方法 2、java对象和json数据 将java对象转成play中的JsonNode类型&#xff1a; 将JsonNode格式的数据解析到java对象…

P2354,jzoj3757-[NOI2014]随机数生成器【贪心,暴力】

正题 题目链接:https://www.luogu.com.cn/problem/P2354 解题思路 以1∼n∗m1\sim n*m1∼n∗m的数字组成的n∗mn*mn∗m的矩阵&#xff0c;求一条路径使得路径上的数排序后字典序最小。 解题思路 考虑从小到大依次枚举来判断是否可行。 每次判断一个点是否可以经过然后加入一…

Detection of Extraterrestrial KMP匹配 重复k次子串 好题

一开始以为这道题是后缀数组&#xff0c;想了好久没想明白怎么做&#xff0c;后来发现暴力枚举起点&#xff0c;进行KMP就好了。 枚举起点以后&#xff0c;构建fail数组。 遍历fail数组&#xff0c;如果串s[l,r]是由串s[s,t]重复k次得到的&#xff0c;那么fail数组的样子一定…

【贪心】最大连续数列的和

最大连续数列的和最大连续数列的和最大连续数列的和 题目描述 求最大连续子序列的和 输入 第一行输入n(n<500),第二行为n个以空格分开的整数(-1000到1000之间) 输出 该序列中最大的连续子序列的和 输入样例 &#xff16; 1 2 -5 6 7 8 输出样例 21 解题思路 用…

农行基于TFS工具的敏捷转型实践

““春天工程”项目组是应用开发二部最早采用敏捷模式的项目组&#xff0c;项目组在项目推进过程中使用Scrum框架&#xff0c;结合“看板站会”形式&#xff0c;积极探索项目推进新措施。结合TFS工具逐步实现了电子工具与物理看板的有机融合&#xff0c;并在过程管理、版本管理…

6、XML数据处理

1、处理xml请求 两种方式&#xff0c;一是直接将请求体数据转成Document对象&#xff1a; 二是定义自己的解析格式将请求体进行解析&#xff1a; 2、返回xml格式数据响应 设置响应头格式为application/xml类型

.NET Core:新的快速开发平台

.NET Core 今年已经发布了 2.0 版本了。技术雷达最近将 .NET Core 从“评估”移到了“试用”阶段&#xff0c;意味着运用这项技术的风险在不断减小。本文将简要介绍基于 .NET Core 的快速开发的方式。.NET Core 产生于 2014年&#xff0c;是一个不折不扣的新开发平台。SmallTal…

Juice Extractor dp

题意&#xff1a; 水果忍者游戏&#xff0c;给出N个水果的出现时间和消失时间。 每次切可以清除该时刻中屏幕上的所有水果&#xff0c;只有combo>3的时候才得分&#xff0c;得分为combo的值。 题解&#xff1a; 可以把每个水果看成是一段时间区间。 然后把这些区间按照…