【GDSOI2017第二轮模拟】树
2017-04-17 21:20
302 查看
题目
Description有n个点,它们从1到n进行标号,第i个点的限制为度数不能超过A[i].
现在对于每个s (1 <= s <= n),问从这n个点中选出一些点组成大小为s的有标号无根树的方案数。
Input
第一行一个整数n.
第二行n个整数表示A[i].
Output
输出一行n个整数,第i个整数表示s=i时的答案。答案模1004535809 = 479 * 2^{21} + 1。
Sample Input
3
2 2 1
Sample Output
3 3 2
Data Constraint
20%的数据:n <= 6
60%的数据:n <= 50
100%的数据:n <= 100
题解
首先这道题要用到一个叫prufer序列的猎奇废物东西,这个东西大概就是一个树(森林)的映射吧,即对于每一个编号为(1..n)的森林都有唯一对应的prufer序列,这个序列的生成方法就是每一次找到无根树的叶子节点,把与这个节点相连的点放到prufer序列中,然后删掉这个节点,反复做直到只有两个点那么这一道题实际上就是求profit序列的个数,容易发现其实一个点出现的次数就是它的边数-1,所以我们可以直接dp
设f[i][j][k]表示现在做完前i个点,取了j个点,序列中有k个点的方案数,转移显然,初始状态就是f[0][0][0]
贴代码
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define fo(i,a,b) for (i=a;i<=b;i++) #define ll long long using namespace std; const int maxn=105,md=1004535809; ll c[maxn][maxn],f[maxn][maxn][maxn]; int a[maxn]; int i,j,k,l,n; ll ans,x,y,z; int main(){ freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); scanf("%d",&n); fo (i,1,n) scanf("%d",&a[i]); c[1][1]=1; fo (i,2,n+1){ c[i][1]=1; fo(j,2,i) c[i][j]=(c[i-1][j-1]+c[i-1][j])%md; } f[0][0][0]=1; fo (i,0,n-1){ fo(j,0,i){ fo(k,0,n){ f[i+1][j][k]=(f[i+1][j][k]+f[i][j][k])%md; fo(l,0,a[i+1]-1) { if (k+l>n) break; x=f[i][j][k]*c[k+l+1][l+1]; x=x%md; f[i+1][j+1][k+l]+=x; if (f[i+1][j+1][k+l]>md) f[i+1][j+1][k+l]-=md; } } } } printf("%d ",n); printf("%d ",n*(n-1)/2); fo(i,3,n) printf("%lld ",f [i][i-2]); }
相关文章推荐
- 【jzoj5069】【GDSOI2017第二轮模拟】【蛋糕】【莫比乌斯反演】【杜教筛】
- 【GDSOI2017第二轮模拟】树
- 【jzoj5068】【GDSOI2017第二轮模拟】【树】【动态规划】
- 【jzoj5071】【GDSOI2017第二轮模拟】【奶酪】【树形动态规划】
- 【JZOJ5068】【GDSOI2017第二轮模拟】树
- JZOJ 5068. 【GDSOI2017第二轮模拟】树
- 【JZOJ5069】【GDSOI2017第二轮模拟】蛋糕
- 【GDSOI2017第三轮模拟】Gift
- NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day1
- GDOI2017模拟第二轮 4.15-4.17
- 【GDSOI2017模拟4.13】炮塔(最小割)
- 【GDOI2017第二轮模拟day2】中位数
- [jzoj5073 GDOI2017第二轮模拟] 影魔
- 【JZOJ5082】【GDSOI2017第三轮模拟】Informatics Training
- 【GDSOI2017模拟4.13】采蘑菇(点剖||线段树)
- jzoj【GDOI2017第二轮模拟day2】开房间
- 【GDSOI2017第三轮模拟】Travel Plan
- 【jzoj5093】【GDSOI2017第四轮模拟day3】【字符串匹配】【哈希】
- 【GDOI2017第二轮模拟day1】公路建设
- 【GDOI2017第二轮模拟day1】最长路径(性质题,容斥,组合数学)