牛客(多校7):Valuable Forests
2020-08-02 19:57
1176 查看
示例1:
输入
5 1000000007 2 3 4 5 107
输出
2 24 264 3240 736935633
题意:
一个森林的代价为内部每个节点度数的平方和。问所有带标号的n 个点的森林的代价和 。
代码:
#include <bits/stdc++.h> using namespace std; const int N = 5000+1; int MOD,n,t; int C[N][N],F[N][N]; int f[N],g[N],h[N],dp[N]; int main(){ scanf("%d %d",&t,&MOD); C[0][0]=1; for(int i=1;i<N;++i) C[0][i]=0,C[i][0]=1; for(int i=1;i<N;++i) for(int j=1;j<=i;++j) C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD; F[0][0]=1; for(int i=1;i<N;++i){ F[i][0]=1; for(int j=1;j<N;++j) F[i][j]=1LL*F[i][j-1]*i%MOD; } h[2]=2; for(int i=3;i<N;++i){ for(int j=0;j<i-1;++j){ h[i]=(h[i]+1LL*C[i-1][j]*j*j%MOD*F[i-1][i-j-2]%MOD*j)%MOD; } h[i]=(h[i]+(i-1)*(i-1))%MOD; h[i]=1LL*h[i]*i%MOD; // if(i<20) printf("%lld ",h[i]); } f[0]=1; g[0]=1; f[1]=1; g[1]=1; for(int i=2;i<N;++i){ f[i]=F[i][i-2]; g[i]=f[i]; for(int j=1;j<i;++j) g[i]=(g[i]+1LL*C[i-1][j-1]*f[j]%MOD*g[i-j])%MOD; // if(i<20) printf("%lld ",[i]); } for(int i=2;i<N;++i){ dp[i]=h[i]; for(int j=1;j<i;++j){ dp[i]=(dp[i]+1LL*C[i-1][j-1]*h[j]%MOD*g[i-j])%MOD; dp[i]=(dp[i]+1LL*C[i-1][j-1]*f[j]%MOD*dp[i-j]%MOD)%MOD; } } while(t--){ scanf("%d",&n); printf("%d\n",dp[n]); } }
相关文章推荐
- 牛客多校第三场——E.Sort String
- 2019牛客暑期多校训练营(第一场)J:Fraction Comparision
- 2019牛客多校训练(二)
- 2019牛客暑期多校训练营(第三场) D-Big Integer
- 启发式分治:2019牛客多校第三场 G题 Removing Stones
- 2019牛客多校训练(六)
- Find the median(线段树+离散化)(2019牛客暑期多校训练营(第七场))
- 牛客多校第一场 A-B-Suffix Array(后缀数组)
- 2019牛客暑期多校训练营(第三场) B题
- 2019牛客暑期多校训练营(第四场)I string —— 后缀自动机+回文自动机
- 2019牛客暑期多校训练营(第四场)A
- 2019牛客暑假多校训练赛第五场F题 maximum clique 1 (最大团,补图最大独立集)
- 2019牛客暑期多校训练营(第八场) C CDMA 构造题
- 2019牛客暑期多校训练营(第八场)J Just Jump(组合数学+容斥问题+dp)
- 2019牛客暑期多校训练营 (第九场) E All men are brothers 【并查集+思维】
- 知识点 - 区间分治(启发式分治) 19HDU多校#10 1011 Make Rounddog Happy 19牛客多校#3 G Removing Stones UVALive-6258 题解
- 2019牛客暑期多校训练营(第一场)
- 2020牛客多校第五场 I Hard Math Problem (画出结果的样子)
- 2019牛客暑期多校训练营(第一场)
- 2019牛客暑期多校训练营(第一场)J-Fraction Comparision