题目链接 Permutation

题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数。

数据规模为n <= 40,m <= 20。 直接状压DP空间肯定是不够的。

考虑到m <= 20,说明每个连通块的大小不超过21。

那么我们分别对每个连通块求方案数,并且把不同的连通块的方案数组合起来即可。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const LL mod = 1e9 + 7; const int N = 105; int n, m, s, cnt;
int mp[N][N], a[N][N], b[N], col[N], pre[N];
LL c[N][N], f[1 << 22], ans;
vector <int> v[N]; void init(){
c[0][0] = 1;
rep(i, 1, N - 2){
c[i][0] = 1;
rep(j, 1, i - 1){
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
c[i][j] %= mod; }
c[i][i] = 1;
}
} void dfs(int x){
col[x] = cnt;
for (auto u : v[x]){
if (col[u]) continue;
dfs(u);
}
} int main(){ init(); while (~scanf("%d%d", &n, &m)){ rep(i, 0, n + 1) v[i].clear();
memset(mp, 0, sizeof mp);
memset(col, 0, sizeof col);
rep(i, 1, m){
int x, y;
scanf("%d%d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
mp[x][y] = 1;
mp[y][x] = -1;
} cnt = 0;
rep(i, 1, n) if (!col[i]) ++cnt, dfs(i); memset(b, 0, sizeof b);
rep(i, 1, n) a[col[i]][b[col[i]]++] = i; s = n;
ans = 1; rep(i, 1, cnt){
int maxS = (1 << b[i]) - 1;
rep(j, 0, maxS + 2) f[j] = 0;
f[0] = 1LL;
memset(pre, 0, sizeof pre);
rep(j, 0, b[i] - 1){
rep(k, 0, b[i] - 1) if (j ^ k){
if (mp[a[i][j]][a[i][k]] == 1) pre[k] |= (1 << j);
}
} rep(S, 0, maxS) if (f[S] > 0){
rep(j, 0, b[i] - 1){
if (((S & pre[j]) == pre[j]) && !(S & (1 << j))){
f[S | (1 << j)] += f[S];
f[S | (1 << j)] %= mod;
}
}
} ans = ans * f[(1 << b[i]) - 1] % mod * c[s][b[i]] % mod;
s -= b[i];
} printf("%lld\n", ans);
}
return 0;
}

最新文章

  1. 【知识积累】DES算法之C#加密&amp;Java解密
  2. docker管理shipyard中文版v3.0.2更新
  3. 【8-15】Markdown语法学习
  4. iOS开发——项目实战总结&amp;Block使用注意点浅析
  5. Untracked files不想add
  6. Legendre polynomials
  7. sencha touch list(列表)、 store(数据源)、model(模型)详解
  8. SyntaxError: missing ; before statement 错误的解决
  9. windows phone中ListBox的简单使用
  10. Symbol Table
  11. JS 返回上一步(退回上一步上一个网页)
  12. hdoj 1231 最大连续子列和
  13. HTML5基础知识及相关笔记
  14. 》》stroll--各种特效下拉菜单
  15. LOJ #6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
  16. js中对于逗号的运算符!
  17. Class--2019-04-14
  18. jquery的优良继承方法
  19. lua 基础 之 坑一样的地方
  20. VBS学习

热门文章

  1. html制作简单框架网页 实现自己的音乐驿站 操作步骤及源文件下载 (播放功能限mp3文件)
  2. Vue构建项目
  3. 【dp】bzoj1613: [Usaco2008 Jan]Running贝茜的晨练计划
  4. 【Git版本控制】git---从已有分支拉出新的分支
  5. verilog RTL 编程实践之五
  6. PHP方法之 substr
  7. Ubuntu18.04 无法解析域名
  8. 关于security的简单理解和应用
  9. BZOJ 4557: [JLoi2016]侦察守卫
  10. Python学习案例