hdu 5622 KK's Chemical
来源:互联网 发布:网络武侠小说推荐 编辑:程序博客网 时间:2024/04/27 17:24
传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=5622
根据药品之间的相互关系,我们可以构建一张图,我们对相互会发生反应的药品连边
这个图的特征,是一个环加上一些“树”(可能有多个联通块)
一个环(1,2,3,4,5……,n)m染色的方案数:递推,设第一个点颜色为1
f[I,1]表示i点颜色为1的种数,f[I,0]为颜色不为1时(不考虑n与1颜色不同)
则F[I,0]=f[i-1,0](m-2)+f[i-1,1](m-1),F[I,1]=f[i-1,0]
那么方案数为f[n,0]*m
一个根节点颜色固定且有k个孩子的树的m染色的方案数={(m-1)}^{k}(m−1)
k
,因为每个点的颜色只要与他的父亲颜色不同,即m-1种
因为乘法原理,一个联通块的方案数=环方案数*以环上每个点为根的树的积。多个联通块,再连乘即可。
#include <cstdio>#include <iostream>#include <cstring>#include <vector>#define LL long long#define pii pair <int, int>#define xx first#define yy second#define ULL unsigned long longusing namespace std;const int N = 110, M = 1100, mod = 1e9 + 7;int a[N], cnt, sz, vis[N];int dp[N][2];vector <int> g[N];void dfs (int u, int fa, int dep) {// cout << "u " << u << ' ' << fa << ' ' << dep << endl; if (vis[u]) { if (!sz) sz = dep - vis[u]; return; } cnt++; vis[u] = dep; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (v == fa) continue; dfs (v, u, dep + 1); }}int main () {// freopen ("in.txt", "r", stdin); int T; cin >> T; while (T--) { int n, k, a; cin >> n >> k; for (int i = 0; i < n; i++) g[i].clear(); for (int i = 0; i < n; i++) { scanf ("%d", &a); g[i].push_back (a); g[a].push_back (i); } if (k == 1) { if (n == 1) cout << 1 << endl; else cout << 0 << endl; continue; } memset (dp, 0, sizeof dp); dp[1][1] = k; for (int i = 1; i < n; i++) { dp[i + 1][0] = (1LL * dp[i][0] * (k - 2) + 1LL * dp[i][1] * (k - 1)) % mod; dp[i + 1][1] = dp[i][0]; }// for (int i = 1; i <= n; i++) cout << dp[i][0] <<' '; cout <<endl;// for (int i = 1; i <= n; i++) cout << dp[i][1] <<' '; cout <<endl; memset (vis, 0, sizeof vis); LL res = 1; for (int i = 0; i < n; i++) if (!vis[i]) { sz = 0; cnt = 0; dfs (i, -1, 1);// cout << cnt << ' ' << sz << endl; if (!sz) sz = 2; (res *= dp[sz][0]) %= mod; cnt -= sz; while (cnt--) (res *= (k - 1)) %= mod; } cout << res << endl; }}
1 0
- hdu 5622 KK's Chemical
- HDU 5622 KK's Chemical
- HDU 5622 KK's Chemical(dp+组合数学)
- HDU 5622 KK's Chemical(dp + 计数、特殊图的染色多项式)
- HDU 5620 KK's Steel
- HDU 5620 KK's Steel
- HDU 5621 KK's Point
- HDU 5623 KK's Number
- HDU 5624 KK's Reconstruction
- hdu 5624 KK's Reconstruction
- HDU 5621 KK's Point
- hdu 5623 KK's Number
- HDU 5623 KK's Number(DP)
- hdu 5621 KK's Point【思维】
- hdu 5621 KK's Point【思维】
- hdu 5623 KK's Number dp 博弈
- HDU 5621 KK's Point(规律)
- HDU 5620 KK's Steel <贪心思维>
- 1.2回归之线性模型summary函数汇总
- CodeForces 116A Tram
- 数组和List的转换
- 祝大家新年好
- [CDQ分治与整体二分]个人对CDQ分治与整体二分的理解
- hdu 5622 KK's Chemical
- vs2013中经常会遇到XXX与XXXXX不兼容
- Android随性笔录之活动返回信息
- Docker的使用场景总结
- 基于MATLAB与C++的混合编程
- final关键字
- POJ 1061 青蛙的约会【扩欧】
- Terrier文档翻译:组件
- Algorithm, Counting sort