正题


题目大意

一个节点的权值定义为它度数的平方,求所有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∑n​sn−i​fi​(i−1n−1​)
然后还要算上非指定的子树中和111号点联通的其他节点的方案,那么有
gn=∑i=0nsiri+1(ni)g_n=\sum_{i=0}^ns_ir_{i+1}\binom{n}{i}gn​=i=0∑n​si​ri+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】相关推荐

  1. 小米2019秋招面试算法题 最少立方数之和 dp与dfs解法

    题目 最少立方数之和 链接:https://www.nowcoder.com/questionTerminal/4bc284dc9d0144628a722eb5d1191ef3?toCommentId ...

  2. LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP

    传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...

  3. [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理

    [CTS2019]氪金手游 题目传送门: luogu 分析 先考虑一下那个奇怪的条件(都知道是哪个吧) 它实际上是说,整个结构形成了一棵树. 但是这棵树很奇怪,边有顺的也有反的. 先考虑全是顺的边的情 ...

  4. Codeforces 940 E.Cashback (单调队列,dp)

    Codeforces 940 E.Cashback 题意:一组数,要分为若干个区间,每个区间长度为ki(1<=ki<=n),并且对于每个区间删去前ki/c(向下取整)个小的数(即对区间升序 ...

  5. HNOI2015题解

    奇了怪了我上次发的题解怎么不见了? 题意自己戳链接-- Day 1 HNOI2015 Arthur 思路:期望DP 直接DP是死也D不出的 转化一下 令f[i][j]--第i张卡在第j回合发动的概率 ...

  6. PageRank算法--从原理到实现

    本文将介绍PageRank算法的相关内容,具体如下: 1.算法来源 2.算法原理 3.算法证明 4.PR值计算方法 4.1 幂迭代法 4.2 特征值法 4.3 代数法 5.算法实现 5.1 基于迭代法 ...

  7. [SDOI2008]SUE的小球

    [SDOI2008]SUE的小球 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Form ...

  8. 牛客国庆集训派对Day6

    牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到1+3+5+...+2k−1=k21+3+5+...+2k-1 = k^21+3+5+.. ...

  9. JAVA的静态方法的运算_java. util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作。...

    java. util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. /* public static double abs ( double num):获取绝对值 ...

  10. leetcode - 740. 删除与获得点数

    740. 删除与获得点数 -------------------------------------------- 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 n ...

最新文章

  1. FPGA等效门数的计算方法
  2. ASP.NET常被忽视的一些细节
  3. SqlConnection的open打开后没关闭的后果
  4. UFLDL深度学习笔记 (三)无监督特征学习
  5. 程序员公开上班摸鱼神器!有了它,老板都不好意思打扰你!
  6. Log4j的组件和配置文件介绍
  7. VDUSE(vDPA Device in Userspace)技术简介
  8. python编写win 本地reader程序_使用Python、win32api和Acrobat Reader 9打印PDF
  9. oracle本地安装注意事项
  10. C#把文字转换成声音
  11. 【hiho一下 第147周】小Hi的烦恼
  12. 少量数据通过Excel表格数据导入server SqlServer查询
  13. spring中的@Bean是否一定要与@Configuration一起用
  14. leg引擎适合什么系统的服务器,BLUE引擎leg引擎登录器配置教程和本地搭建WEB服务器视频教程...
  15. 详解二维数组定义方式
  16. Python 一维数据
  17. spring mvc 配置使用定时任务
  18. HP34401a实现高精度温度测量
  19. 关于前端更新需要清空浏览器缓存
  20. 一个和尚挑水吃,两个和尚抬水吃,三个和尚没水吃

热门文章

  1. float型y取值在1.0c语言表达式,2011年全国计算机二级C语言模拟试题及答案(14)...
  2. ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...
  3. 怎么用ai做出适量插画_怎么用最简单的方法,做出最炫酷的数据可视化图表?...
  4. 50万数据生成6位数不重复字符串_R语言系列3:高级数据管理
  5. 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
  6. Git的使用(快速入门)
  7. leetcode977. 有序数组的平方(暴力+双指针)
  8. android socket 服务端,Android socket 服务端
  9. [JavaWeb-CSS]CSS扩展选择器
  10. [JavaWeb-MySQL]DML_操作表