51nod1835 完全图 容斥+dp
来源:互联网 发布:天津网络教育大学 编辑:程序博客网 时间:2024/06/10 23:51
Description
初始有n个点,任意两个点之间有一条无向边,现在要移除一些无向边(至少一条),问移除后有恰好m个连通块的方案数是多少。
两个方案不同当且仅当存在至少一条无向边在某个方案中被移除,但是在另一个方案中没被移除。
答案可能很大请模一个998,244,353。
Input
第一行读入n,m。
1<=m<=n<=500
Output
第一行输出方案数。
Solution
我好弱啊,算法马拉松只会这题,还T了
首先讲一下怎么做m=1的情况
考虑容斥。设
类似的,
这里的组合数最好打杨辉三角形的表不然容易T
考虑到题目中提到的至少删一条边,我们要在m=1时去掉完全图的方案
Code
#include <stdio.h>#include <string.h>#define rep(i,st,ed) for (int i=st;i<=ed;++i)#define fill(x,t) memset(x,t,sizeof(x))#define ll long long#define N 505#define M 224751#define MOD 998244353ll f[N][N],c[N][N],jc[M];int n,m;void init() { rep(i,0,n) { c[i][0]=1; rep(j,1,i) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD; } } int lim=c[n][2]; jc[0]=1; rep(i,1,lim) jc[i]=(jc[i-1]+jc[i-1])%MOD;}ll ksm(ll x,ll dep) { ll ret=1; for (;dep;dep>>=1,x=x*x%MOD) { if (dep&1) { ret=ret*x%MOD; } } return ret;}int main(void) { scanf("%d%d",&n,&m); init(); f[1][1]=1; ll tmp=0; rep(i,2,n) { f[i][1]=jc[c[i][2]]; rep(j,1,i-1) { tmp=c[i-1][j-1]; f[i][1]=(f[i][1]+MOD-c[i-1][j-1]*jc[c[i-j][2]]%MOD*f[j][1]%MOD)%MOD; } } rep(j,2,m) { rep(i,j,n) { rep(k,1,i-1) { f[i][j]=(f[i][j]+c[i-1][k-1]*f[i-k][j-1]%MOD*f[k][1]%MOD)%MOD; } } } if (m==1) { f[n][m]+=MOD-1; f[n][m]%=MOD; } printf("%lld\n",f[n][m]); return 0;}
阅读全文
0 0
- 51nod1835 完全图 容斥+dp
- 51Nod - 1407 容斥原理 + dp
- 数字 【DP+容斥】
- bzoj1042 dp+容斥
- hdu4632(区间dp+容斥)
- BZOJ 2287 DP+容斥
- BZOJ 1042 dp+容斥
- bzoj2669 [ CQOI2012 ] -- DP+容斥
- BZOJ 3622 DP+容斥
- 51nod 1610 路径计数(容斥+dp)
- 51nod 1486 大大走格子(dp,容斥)
- 51nod 1407 与与与与 dp+容斥
- bzoj1042 [ HAOI2008 ] --容斥原理+完全背包
- Codeforce 337D 容斥+树形dp
- OpenJudge_P4976 硬币(DP+数论+容斥原理)
- 【bzoj4011】【HNOI2015】【落忆枫音】【dp+容斥原理】
- HDU_5794_ASimpleChess(Lucas定理&&(容斥||dp))
- [bzoj1042][DP][容斥原理]硬币购物
- mysql 查询正在执行的事务以及等待锁 常用的sql语句
- 3年,从工程师到创始人
- 1008. 数组元素循环右移问题 (20)
- SpringMVC在Controller层实现aop,同类中方法调用问题
- Python的基本语法
- 51nod1835 完全图 容斥+dp
- JQ完成省市联动(Xstream)
- AI伦理
- 51nod 1486 大大走格子(组合数学+容斥)
- ADAS行业调研分析
- makefile编写相关符号及命令说明
- 矩阵 细菌繁殖
- lsof命令使用详解
- hive函数spilt中分号";"作为分隔符报错的问题解决