YbtOJ-森林之和【dp】
正题
题目大意
一个节点的权值定义为它度数的平方,求所有nnn个点的有标号森林的所有节点权值和。
1≤n,T≤5×1031\leq n,T\leq 5\times 10^31≤n,T≤5×103
解题思路
首先因为所有节点本质相同,所以我们可以只考虑一个节点所有情况下的权值和。
然后考虑这个平方和怎么做,我们可以视为指定一个节点连出两颗子树的方案(可以相同)。
那么考虑这个怎么做,首先我们需要处理出nnn个节点有根树和无根树的数组r,fr,fr,f。
然后我们要考虑怎么统计除了指定子树以外的方案,首先我们需要处理出nnn个点的森林个数sns_nsn。
我们可以考虑每次枚举新加入的树的大小,但是要指定这个节点编号最小的节点编号必须是111(以防相同的子树算重),那么有
sn=∑i=1nsn−ifi(n−1i−1)s_n=\sum_{i=1}^ns_{n-i}f_{i}\binom{n-1}{i-1}sn=i=1∑nsn−ifi(i−1n−1)
然后还要算上非指定的子树中和111号点联通的其他节点的方案,那么有
gn=∑i=0nsiri+1(ni)g_n=\sum_{i=0}^ns_ir_{i+1}\binom{n}{i}gn=i=0∑nsiri+1(in)
至于指定子树的话,我们枚举指定子树的大小转移就好了。
时间复杂度:O(n2+T)O(n^2+T)O(n2+T)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5100;
ll T,P,C[N][N],f[N],r[N],g[N],s[N],d[N],ans[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
signed main()
{freopen("forest.in","r",stdin);freopen("forest.out","w",stdout);scanf("%lld%lld",&T,&P);C[0][0]=1;for(ll i=1;i<N;i++)for(ll j=0;j<=i;j++)C[i][j]=(C[i-1][j]+(j?C[i-1][j-1]:0))%P;f[0]=f[1]=r[0]=r[1]=g[0]=s[0]=1;for(ll i=2;i<N;i++) f[i]=power(i,i-2),r[i]=f[i]*i%P;for(ll i=1;i<N;i++)for(ll j=0;j<i;j++)(s[i]+=s[j]*f[i-j]%P*C[i-1][j]%P)%=P;for(ll i=1;i<N;i++){for(ll j=0;j<=i;j++)(g[i]+=s[j]*f[i-j+1]%P*C[i][j]%P)%=P;for(ll j=1;j<i;j++)(ans[i]+=r[j]*g[i-j-1]%P*C[i-1][j]%P)%=P;}for(ll i=1;i<N;i++){d[i]=ans[i+1];
// for(ll j=1;j<=i;j++)
// (d[i]+=r[j]*g[i-j]%P*C[i][j]%P)%=P;for(ll j=1;j<i-1;j++)(ans[i]+=d[j]*r[i-j-1]%P*C[i-1][j]%P)%=P;}while(T--){ll n;scanf("%lld",&n);printf("%lld\n",ans[n]*n%P);}return 0;
}
YbtOJ-森林之和【dp】相关推荐
- 小米2019秋招面试算法题 最少立方数之和 dp与dfs解法
题目 最少立方数之和 链接:https://www.nowcoder.com/questionTerminal/4bc284dc9d0144628a722eb5d1191ef3?toCommentId ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理
[CTS2019]氪金手游 题目传送门: luogu 分析 先考虑一下那个奇怪的条件(都知道是哪个吧) 它实际上是说,整个结构形成了一棵树. 但是这棵树很奇怪,边有顺的也有反的. 先考虑全是顺的边的情 ...
- Codeforces 940 E.Cashback (单调队列,dp)
Codeforces 940 E.Cashback 题意:一组数,要分为若干个区间,每个区间长度为ki(1<=ki<=n),并且对于每个区间删去前ki/c(向下取整)个小的数(即对区间升序 ...
- HNOI2015题解
奇了怪了我上次发的题解怎么不见了? 题意自己戳链接-- Day 1 HNOI2015 Arthur 思路:期望DP 直接DP是死也D不出的 转化一下 令f[i][j]--第i张卡在第j回合发动的概率 ...
- PageRank算法--从原理到实现
本文将介绍PageRank算法的相关内容,具体如下: 1.算法来源 2.算法原理 3.算法证明 4.PR值计算方法 4.1 幂迭代法 4.2 特征值法 4.3 代数法 5.算法实现 5.1 基于迭代法 ...
- [SDOI2008]SUE的小球
[SDOI2008]SUE的小球 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Form ...
- 牛客国庆集训派对Day6
牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到1+3+5+...+2k−1=k21+3+5+...+2k-1 = k^21+3+5+.. ...
- JAVA的静态方法的运算_java. util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作。...
java. util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. /* public static double abs ( double num):获取绝对值 ...
- leetcode - 740. 删除与获得点数
740. 删除与获得点数 -------------------------------------------- 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 n ...
最新文章
- FPGA等效门数的计算方法
- ASP.NET常被忽视的一些细节
- SqlConnection的open打开后没关闭的后果
- UFLDL深度学习笔记 (三)无监督特征学习
- 程序员公开上班摸鱼神器!有了它,老板都不好意思打扰你!
- Log4j的组件和配置文件介绍
- VDUSE(vDPA Device in Userspace)技术简介
- python编写win 本地reader程序_使用Python、win32api和Acrobat Reader 9打印PDF
- oracle本地安装注意事项
- C#把文字转换成声音
- 【hiho一下 第147周】小Hi的烦恼
- 少量数据通过Excel表格数据导入server SqlServer查询
- spring中的@Bean是否一定要与@Configuration一起用
- leg引擎适合什么系统的服务器,BLUE引擎leg引擎登录器配置教程和本地搭建WEB服务器视频教程...
- 详解二维数组定义方式
- Python 一维数据
- spring mvc 配置使用定时任务
- HP34401a实现高精度温度测量
- 关于前端更新需要清空浏览器缓存
- 一个和尚挑水吃,两个和尚抬水吃,三个和尚没水吃
热门文章
- float型y取值在1.0c语言表达式,2011年全国计算机二级C语言模拟试题及答案(14)...
- ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...
- 怎么用ai做出适量插画_怎么用最简单的方法,做出最炫酷的数据可视化图表?...
- 50万数据生成6位数不重复字符串_R语言系列3:高级数据管理
- 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
- Git的使用(快速入门)
- leetcode977. 有序数组的平方(暴力+双指针)
- android socket 服务端,Android socket 服务端
- [JavaWeb-CSS]CSS扩展选择器
- [JavaWeb-MySQL]DML_操作表