JZOJ 5351. 【NOIP2017提高A组模拟9.7】简单无向图
2024-10-20 07:41:38
题目大意
给定 \(n\) 个度数为 \(\in [1,2]\) 之间的点,求能组成多少种简单无向图(可不连通,点与点之间有别)
分析
显然答案只与 \(n1,n2\) 有关
那么 \(dp\)?(我也不知道为什么)
设 \(f_{i,j}\) 表示当前状态的图用了 \(i\) 个点,目前其度数为 \(1\);\(j\) 同理,度数为 \(2\)
四种转移:
- 加入两个度数为 \(1\) 的点,构成一条新链
- 加入度数形如 \(1-2-1\) 一条链
- 在某条链中插入两个度数为 \(2\) 的点
- 变链成环,加入三个度数为 \(2\) 的点
我也不知道为什么这么转移
然后具体统计看代码
\(Code\)
#include<cstdio>
using namespace std;
typedef long long LL;
const int N = 2005;
const LL P = 998244353;
int d[N] , n , n1 , n2;
LL ans , f[N][N];
int main()
{
freopen("graph.in" , "r" , stdin);
freopen("graph.out" , "w" , stdout);
scanf("%d" , &n);
for(register int i = 1; i <= n; i++)
scanf("%d" , &d[i]) , (d[i] == 1 ? n1++ : n2++);
f[0][0] = 1;
for(register int j = 0; j <= n2; j++)
for(register int i = 0; i <= n; i++)
{
if (!f[i][j]) continue;
if (!j) f[i + 2][j] = (f[i + 2][j] + f[i][j] * (i + 1)) % P;
f[i + 2][j + 1] = (f[i + 2][j + 1] + (i + 2) * (i + 1) / 2 % P * f[i][j] % P) % P;
f[i][j + 2] = (f[i][j + 2] + f[i][j] * i % P * (j + 1)) % P;
if (i >= 2) f[i - 2][j + 3] = (f[i - 2][j + 3] + (j + 2) * (j + 1) / 2 % P * f[i][j]) % P;
}
printf("%lld" , f[n1][n2]);
}
最新文章
- [LeetCode]444. Sequence Reconstruction
- Optimistic Concurrency VS. Pessimistic Concurrency Control
- js事件处理、事件对象
- 产品需求文档(PRD)的写作方法之笔记一
- Vue学习笔记-1
- LNMP环境搭建配置memcache
- 解决mysql登陆时出现“ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket &#39;/var/run/mysql/mysql.sock&#39; (2)”
- Distributed R
- poj 2513 连接火柴 字典树+欧拉通路 好题
- hdu_3565_Bi-peak Number(数位DP)
- 圖片裁剪大頭貼功能 - ASP.NET WebForm + jQuery + imgAreaSelect
- Cocoapods最新安装教程
- 201521123074 《Java程序设计》第11周学习总结
- 数据提交成功后如何避免alert被window.location.reload()影响
- 每周分享五个 PyCharm 使用技巧(一)
- RabbitMQ channel 参数详解
- CAS统一登录认证好文汇集贴
- Jenkins+Jmeter+Ant自动化集成及邮件正文以html输出
- js-day02
- 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp