解题:国家集训队 Crash 的文明世界

2023-10-20 12:50

本文主要是介绍解题:国家集训队 Crash 的文明世界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题面

这种套着高次幂的统计问题一般都要用到第二类斯特林数和自然数幂的关系:$a^k=\sum\limits_{i=0}^{k}S_k^iC_a^i*i!$

那么对于每个点$x$有:

$ans_x=\sum\limits_{i=0}^k S_{k}^i C_{\sum dis(x,j)}^i i!$

问题变成求$C_{\sum dis(x,j)}^i$,神仙告诉我们,这个东西要DP求

为什么要DP求?先往下看

那么就设$dp[i][k]$表示以i为根的子树里$C_{\sum dis(i,j)}^k$的值,$pd[i][k]$表示以$i$为根的子树外......的值

$dp$数组是符合我们常做的树形DP的思路的,先看这个

转移当然是从儿子合并啦:

$dp[i][k]=C_{\sum dis(i,j)}^k$

$=C_{\sum dis(son,j)+1}^k+[k==0]$

好,现在回答为什么要DP?因为根据组合数的性质$C_n^m=C_{n-1}^m+C_{n-1}^{m-1}$,这里可以直接转移

$=C_{\sum dis(son,j)}^k+C_{\sum dis(son,j)}^{k-1}+[k==0]$

$=dp[son][k]+dp[son][k-1]+[k==0]$

这样一来就可以从父亲往下转移求$pd$了,下面用$C'$表示从父亲转移过来时的组合数(区别于子树)

$dp[i][k]={C'}_{\sum dis(i,j)}^k$

$={C'}_{\sum dis(fth,j)+1}^k+C_{\sum dis(fth,j)+1}^k-C_{\sum dis(i,j)+1}^k$

爆拆一通得到:

$=pd[fth][k]+pd[fth][k-1]+dp[fth][k]+dp[fth][k-1]-dp[i][k]-2*dp[i][k-1]-dp[i][k-2]$

于是做完了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=50005,M=200,mod=10007;
 6 int n,k,t1,t2,cnt;
 7 int fac[N],inv[N],st2[M][M];
 8 int p[N],noww[2*N],goal[2*N];
 9 long long dp[N][M],pd[N][M];
10 void Add(long long &x,int y)
11 {
12     x+=y;
13     if(x>=mod) x-=mod;
14 }
15 int C(int n,int m)
16 {
17     return n<m?0:1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
18 }
19 int Qpow(int x,int k)
20 {
21     if(k==1) return x;
22     int tmp=Qpow(x,k/2);
23     return k%2?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;
24 }
25 void Link(int f,int t)
26 {
27     noww[++cnt]=p[f];
28     goal[cnt]=t,p[f]=cnt;
29     noww[++cnt]=p[t];
30     goal[cnt]=f,p[t]=cnt;
31 }
32 void Pre()
33 {
34     fac[0]=inv[0]=1,st2[0][0]=1;
35     for(int i=1;i<=k;i++)
36         for(int j=1;j<=k;j++)
37             st2[i][j]=(st2[i-1][j-1]+1ll*st2[i-1][j]*j%mod)%mod;
38     for(int i=1;i<=k;i++)
39         fac[i]=1ll*fac[i-1]*i%mod;
40     inv[k]=Qpow(fac[k],mod-2);
41     for(int i=k-1;i;i--)
42         inv[i]=1ll*inv[i+1]*(i+1)%mod;
43 }
44 void Gettre(int nde,int fth)
45 {
46     dp[nde][0]=1;
47     for(int i=p[nde],g;i;i=noww[i])
48         if(goal[i]!=fth)
49         {
50             Gettre(g=goal[i],nde);
51             Add(dp[nde][0],dp[g][0]);
52             for(int j=1;j<=k;j++)
53                 Add(dp[nde][j],(dp[g][j]+dp[g][j-1])%mod);
54         }
55 }
56 void Getanc(int nde,int fth)
57 {
58     if(nde!=1)
59     {
60         for(int i=0;i<=k;i++)
61         {
62             pd[nde][i]=pd[fth][i]+dp[fth][i]-dp[nde][i];
63             if(i>=1) pd[nde][i]+=pd[fth][i-1]+dp[fth][i-1]-2*dp[nde][i-1];
64             if(i>=2) pd[nde][i]-=dp[nde][i-2]; pd[nde][i]=(pd[nde][i]%mod+mod)%mod;
65         }
66     }
67     for(int i=p[nde];i;i=noww[i])
68         if(goal[i]!=fth) Getanc(goal[i],nde);
69 }
70 int main()
71 {
72     scanf("%d%d",&n,&k),Pre();
73     for(int i=1;i<n;i++)
74         scanf("%d%d",&t1,&t2),Link(t1,t2);
75     Gettre(1,0),Getanc(1,0);
76     for(int i=1;i<=n;i++)
77     {
78         long long ans=0;
79         for(int j=0;j<=k;j++)
80             Add(ans,1ll*st2[k][j]*fac[j]%mod*(dp[i][j]+pd[i][j])%mod);
81         printf("%lld\n",ans);
82     }
83     return 0;
84 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10461530.html

这篇关于解题:国家集训队 Crash 的文明世界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247199

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

【Linux】萌新看过来!一篇文章带你走进Linux世界

🚀个人主页:奋斗的小羊 🚀所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、初识Linux💥1.1 什么是操作系统?💥1.2 各种操作系统对比💥1.3 现代Linux应用💥1.4 Linux常用版本 💥2、Linux 和 Windows 目录结构对比💥2.1 文件系统组织方式💥2.2

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-FanoutExchange4、路

hdu1879(解题报告)

继续畅通工程                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)