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 ...
随机推荐
- 微软职位内部推荐-Senior Data Scientist
微软近期Open的职位: Extracting accurate, insightful and actionable information from data is part art and pa ...
- Netty多线程处理机制
技术点描述 本文主要研究NioServerSocketChannelFactory类和NioDatagramChannelFactory类, 以及这两个类的各自作用. 由于基于pipelineFact ...
- 在一个工程管理多个应用-b
Demo:http://download.csdn.net/detail/u012881779/9166527 本文的产生是因产品经理提出的特殊需求: 一个针对多所学校的应用,对不同学校需要分别使用一 ...
- IE 坑爹的浏览器兼容模式
作为作为Web的前端开发人员,最悲催的莫过于要不断的,不断的去调试各种浏览器的显示效果,个人比较喜欢用火狐浏览器来做开发和调试,对于不怎么懂CSS的我来说,IE的样式调整一看就头大了.对于没有美工的团 ...
- [scalability] Find all documents that contain a list of words
Given a list of millions of documents, how would you find all documents that contain a list of words ...
- 如何提高多线程程序的cpu利用率
正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情.在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行.然后,事情确 ...
- php的redis 操作类,适用于单台或多台、多组redis服务器操作
redis 操作类,包括单台或多台.多组redis服务器操作,适用于业务复杂.高性能要求的 php web 应用. redis.php: <?php /* redis 操作类,适用于单台或多台. ...
- POJ 3761 Bubble Sort(乘方取模)
点我看题目 题意 : 冒泡排序的原理众所周知,需要扫描很多遍.而现在是求1到n的各种排列中,需要扫描k遍就变为有序的数列的个数,结果模20100713,当然了,只要数列有序就扫描结束,不需要像真正的冒 ...
- jmeter 一个可能引起性能严重下降的断言设置
在添加断言时一定要注意: 1. 红框部分选择 "响应文本", 2. 要断言的内容越短越好
- 修改jmeter jvm参数
记录下常用的linux下 jmeter jvm参数修改,打开jmeter安装目录/bin/jmeter(非jmeter.sh) 1. 修改默认堆内存大小 #默认的 HEAP="-Xms512 ...