国庆集训 Day1 T2 生成图

现在要生成一张\(n\)个点的有向图。要求满足:

1.若有 a->b的边,则有 b->a 的边

2.若有 a->b 的边和 b->c 的边,则有 a->c 的边

3.至少有一个点没有自环。

求方案数模上\(m\)

\(n≤2000,2≤m≤1,000,000,007\)

样例:

input

2 5

output

3

有点难度的DP,首先需要明确的是在一个连通图中每一个点都有自环(样例可体现),所以有点没有自环当且仅当这一个点独立为一个联通块

设\(g[i]\)表示\(i\)个点自由组合,且每个点都存在自环的方案数,\(f[i]\)表示\(i\)个点自由组合,且至少有1个点没有自环的方案数(\(f[n]\)即答案)

考虑\(f[i]\)转移有以下情况:

  • 第\(i\)个点孤立且没有自环,即\(f[i]+=f[i-1]+g[i-1]\)
  • 第\(i\)个点孤立且自环,即\(f[i]+=f[i-1]\)
  • 第\(i\)个点与前\(i-1\)个点中的\(j-1\)个点构成一个大小为\(j\)的联通块,即\(f[i]+=\sum_{j=2}^{i-1}f[i-j]\times C_{i-1}^{j-1}\)

考虑\(g[i]\)转移有以下情况:

  • 第\(i\)个点孤立且自环,即\(g[i]+=g[i-1]\)
  • 类似的,第\(i\)个点与前\(i-1\)个点中的\(j-1\)个点构成一个大小为\(j\)的联通块,即\(g[i]+=\sum_{j=2}^{i-1}g[i-j]\times C_{i-1}^{j-1}\)

为求\(C_n^m\),我们可以利用杨辉三角,第\(i\)行第\(j\)列(\(i\)从0开始)即为\(C_i^j\)

#include <cstdio>
#define MAXN 2002
#define ll long long
using namespace std;
ll C[MAXN][MAXN]; //C[n][m]
ll f[MAXN],g[MAXN];
int n,MOD;
int main(){
scanf("%d %d", &n, &MOD);
for(int i=0;i<=n;++i){
C[i][0]=1;
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
f[1]=1;
g[1]=1;
for(int i=2;i<=n;++i){
g[i]=g[i-1]%MOD;
for(int j=2;j<=i-1;++j)
g[i]=(g[i]+g[i-j]*C[i-1][j-1]%MOD)%MOD;
g[i]=(g[i]+1)%MOD;
f[i]=(f[i-1]+f[i-1]+g[i-1])%MOD;
for(int j=2;j<=i-1;++j)
f[i]=(f[i]+f[i-j]*C[i-1][j-1]%MOD)%MOD;
}
printf("%lld", f[n]);
return 0;
}

一开始题读错了导致后面DP推错了,以后注意要仔细揣摩样例与题意

国庆集训 Day1 T2 生成图 DP的更多相关文章

  1. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  2. 国庆集训Day1

    T1 divide 题意: 有\(n\)个数 \(a_1, a_2,..., a_n\) 有m个数\(b_1, b_2,..., b_n\) 令\(a = a_1\times a_2\,\times ...

  3. 长乐国庆集训Day1

    T1 统计数字 题目 [题目描述] 设 S(N ) 表示 N 的各位数字之和,如 S(484) = 4+8+4 = 16, S(22) = 2+2 = 4. 如果一个正整数满足 S(x*x) = S( ...

  4. 雅礼集训 Day1 T2 折射

    折射 题目描述 小\(\mathrm{Y}\)十分喜爱光学相关的问题,一天他正在研究折射. 他在平面上放置了\(n\)个折射装置,希望利用这些装置画出美丽的折线. 折线将从某个装置出发,并且在经过一处 ...

  5. 暑假提高组集训Day1 T2

    那么这一道题我在考试的时候写挂了(0分 呜呜~) 我原来的思路是广搜来骗取部分分(哈哈~) 但是我忘记了一个非常重要的问题 我广搜开的数组没有考虑负的下标 下一次考试如果再写暴力 就可以把坐标都加上一 ...

  6. 2019 牛客国庆集训day1 2019 点分治

    题目链接:https://ac.nowcoder.com/acm/contest/1099/I 点分治,计算路径数的时候,先将每个点到根的距离模2019,计算的时候就可以O(n)求出数目,对于模201 ...

  7. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  8. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  9. codevs 4511 信息传递(NOIP2015 day1 T2)

    4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...

随机推荐

  1. PB笔记之数据窗口大小自适应的方式

    1.在OPEN 事件中设置数据窗口大小属性 tab_1.tabpage_6.dw_6.x=0tab_1.tabpage_6.dw_6.y=0tab_1.tabpage_6.dw_6.width=thi ...

  2. protobuf的使用(netty传输多种对象类型)

    重点是: 1.枚举DataType的定义 2.oneof的使用

  3. react组件懒加载

    组件懒加载方式-:react新增的lazy const Alert = lazy(() => import('./components/alert')); export default func ...

  4. 算术 HDU - 6715 (莫比乌斯反演)

    大意: 给定$n,m$, 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\mu(lcm(i,j))$ 首先有$\mu(lcm(i,j))=\mu(i)\mu(j)\m ...

  5. Codeforces Round #557 (Div. 1)

    A.直接做. #include<vector> #include<cstdio> #include<cstring> #include<iostream> ...

  6. 使用parted对Linux未分区部分进行分区

    1. 使用命令parted -l 查看当前分区 可以看到硬盘有2396GB即有2.5T , 但是分区就分了50G一个盘, 需要分剩下部分 [root@localhost ~]# parted -l M ...

  7. 调用WebService时加入身份验证,以拒绝未授权的访问

    众所周知,WebService是为企业需求提供的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务.但在有些时候的某些应用服务不希望被未授权访问,那么此时我们可以一下几种 ...

  8. 高德地图模糊搜索地址(elementUI)

    首先引入AMap: 1.在index.html引入AMap <script type="text/javascript" src="http://webapi.am ...

  9. vue导出Excel文件

    1.需要安装file-saver和script-loader.xlsx npm install file-saver / yarn add file-saver npm install script- ...

  10. SAP-参数(条件表)配置教程–GS01/GS02/GS03

    转载:http://www.baidusap.com/abap/others/2849 在SAP开发中,某段代码运行可能需要满足某个条件,通常解决办法有两种:一种是在代码中写死限制条件,此种方式当限制 ...