P4492-[HAOI2018]苹果树【dp】
正題
題目鏈接:https://www.luogu.com.cn/problem/P4492
題目大意
開始有一個節點,第iii次在一個兒子不超過222的節點下面長出一個新兒子編號為iii。求所有方案下樹的路徑長度和。
解題思路
考慮計算每條邊的貢獻,設gig_igi?表示大小為iii的樹的形態個數,fif_ifi?表示所有大小為iii的樹的路徑長度和。然后題目給出的要求就是子節點編號比父節點大。
那么ggg有轉移gi+1=∑j=0igjgi?jCijg_{i+1}=\sum_{j=0}^ig_jg_{i-j}C_{i}^jgi+1?=j=0∑i?gj?gi?j?Cij?
fff的轉移復雜一點,枚舉子樹大小jjj和i?ji-ji?j,那么子樹jjj自己的貢獻就是gj?j?(n?j)g_j*j*(n-j)gj??j?(n?j),然后要乘上gi?jg_{i-j}gi?j?表示每種左子樹形態對應的樹的形態個數。右邊i?ji-ji?j同理,就有轉移方程fi+1=∑j=0i(gigj(j?(n?j)+(i?j)?(n?i+j))+fj?gi?j+fi?j?gj)?Cijf_{i+1}=\sum_{j=0}^i(\ g_ig_j(j*(n-j)+(i-j)*(n-i+j))+f_j*g_{i-j}+f_{i-j}*g_j\ )*C_{i}^jfi+1?=j=0∑i?(?gi?gj?(j?(n?j)+(i?j)?(n?i+j))+fj??gi?j?+fi?j??gj??)?Cij?
時間復雜度O(n2)O(n^2)O(n2)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2100; ll n,p,f[N],g[N],c[N][N]; int main() {scanf("%lld%lld",&n,&p);g[0]=c[0][0]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<=i;j++)c[i][j]=((j?c[i-1][j-1]:0)+c[i-1][j])%p;for(ll i=0;i<n;i++){for(ll j=0;j<=i;j++){(g[i+1]+=g[j]*g[i-j]%p*c[i][j])%=p;(f[i+1]+=(((i-j)*(n-i+j)%p+j*(n-j)%p)*g[j]%p*g[i-j]%p+f[j]*g[i-j]%p+f[i-j]*g[j]%p)%p*c[i][j]%p)%=p;}}printf("%lld\n",f[n]);return 0; }總結
以上是生活随笔為你收集整理的P4492-[HAOI2018]苹果树【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄钻特权
- 下一篇: LOL8.7新版女刀锋刀妹艾瑞莉娅出装和