HDU 5622 KK's Chemical DP
题意:bc round 71(中文题面)
分析(官方题解):
根据药品之间的相互关系,我们可以构建一张图,我们对相互会发生反应的药品连边
这个图的特征,是一个环加上一些“树”(可能有多个联通块)
一个环(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种
因为乘法原理,一个联通块的方案数=环方案数*以环上每个点为根的树的积。多个联通块,再连乘即可
注:其实就是n个点的无向图k染色,相邻的节点颜色不一样,但是这个无向图有一个特点
就是其实无向图是由有向图(把方向去掉)变过来的,每个点的出度为1,所以不存在两个环(如果存在,至少存在一个点出度为2)
也就是官方题解说的,每一个连通块是由一个环和若干树组成
附上代码,这样的话时间复杂度是O(n)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e2+;
const LL mod=1e9+;
LL dp[N][],k;
int c[N],n,T,vis[N];
void init()
{
dp[][]=,dp[][]=;
for(int i=; i<=n; ++i)
{
dp[i][]=(dp[i-][]*(k-)%mod+dp[i-][]*(k-)%mod)%mod;
dp[i][]=dp[i-][];
}
memset(vis,-,sizeof(vis));
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%I64d",&n,&k);
init();
for(int i=; i<n; ++i)
scanf("%d",&c[i]);
int cnt=;
LL ans=;
for(int i=; i<n; ++i)
{
if(vis[i]!=-)continue;
int x=i;
while(vis[x]==-)
{
vis[x]=i;
x=c[x];
}
if(vis[x]!=i)continue;
int tmp=,u=x;
do
{
++tmp;
x=c[x];
}while(x!=u);
ans=ans*(dp[tmp][]*k%mod)%mod;
cnt+=tmp;
}
cnt=n-cnt;
for(int i=;i<cnt;++i)
ans=ans*(k-)%mod;
printf("%I64d\n",ans);
}
return ;
}
HDU 5622 KK's Chemical DP的更多相关文章
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- hdu 2829 Lawrence(斜率优化DP)
题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...
- hdu 4568 Hunter 最短路+dp
Hunter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 1231.最大连续子序列-dp+位置标记
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDU 1078 FatMouse and Cheese ( DP, DFS)
HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 ( ...
- HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)
HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包) 题意分析 裸的完全背包问题 代码总览 #include <iostream> #include <cstdio> ...
- HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛
普通的数位DP计算回文串个数 /* HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 2-36进制下回文串个数 */ ...
- HDU 5623 KK's Number (博弈DP)
KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...
随机推荐
- .net sql connection pool leak
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This ma ...
- 运行windows系统工具命令
appwiz.cpl 卸载/安装程序 wscui.cpl 操作中心 inetcpl.cpl 查看Internet属性 eventvwr 查看监视消息和疑难解答消息 taskmgr 任 ...
- IntPtr
一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型.这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄.它是一个平台特定类型.对于它的解释,这个哥们写的比较 ...
- Samza文档翻译 : Comparison Introduction
http://samza.incubator.apache.org/learn/documentation/0.7.0/comparisons/introduction.html 这里有一些使得Sam ...
- linux jps 命令
参考: http://blog.csdn.net/gtuu0123/article/details/6025520 http://blog.csdn.net/alivetime/article/det ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- 非常好的Demo网站
http://www.xdemo.org/
- python之高性能网络编程并发框架eventlet实例
http://blog.csdn.net/mingzznet/article/details/38388299 前言: 虽然 eventlet 封装成了非常类似标准线程库的形式,但线程和eventle ...
- SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-007-给flowl加权限控制<secured>
States, transitions, and entire flows can be secured in Spring Web Flow by using the <secured> ...
- Mac与Linux的一个巨大不同
就是Mac仍处在桌面市场的商业圈里,尽管它的市场很小,但是正版率却很高,而且还有专门的Mac Store提供付费下载. Linux在桌面市场几乎没有份额,也不会有人会去买它的应用软件,基本上只存在于服 ...