题意: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的更多相关文章

  1. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  2. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  3. hdu 2829 Lawrence(斜率优化DP)

    题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...

  4. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. HDU 1231.最大连续子序列-dp+位置标记

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. HDU 1078 FatMouse and Cheese ( DP, DFS)

    HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 ( ...

  7. HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)

    HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包) 题意分析 裸的完全背包问题 代码总览 #include <iostream> #include <cstdio> ...

  8. HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛

    普通的数位DP计算回文串个数 /* HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 2-36进制下回文串个数 */ ...

  9. HDU 5623 KK's Number (博弈DP)

    KK's Number 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/K Description Our lovely KK h ...

随机推荐

  1. 【BZOJ3524】 [Poi2014]Couriers

    Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. ...

  2. iOS 本地存储四种方法

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍⼀一下数据保存的方式: 1.NSKeye ...

  3. C#学习笔记---基础入门(二)

    枚举 枚举是被命名的整型常数的集合:枚举类型的变量只有赋值后才能使用:不同枚举中的枚举值可以重名:可以自定义枚举值. enum Playstates {            跑, 跳,下滑,左转,右 ...

  4. Nhibernate 多对多级联删除

    在网上找到的方法:查看这里 //-------------------------------------Article.hbm.xml-------------------------------- ...

  5. Contest2037 - CSU Monthly 2013 Oct(中南大学2013年10月月赛水题部分题解)

    Problem A: Small change 题解:http://www.cnblogs.com/crazyapple/p/3349469.html Problem B: Scoop water 题 ...

  6. js页面刷新一次

    // var str = document.location.hash, // index = str.indexOf("#"); // if(index == 0){ // wi ...

  7. PHP5 session 详解

    http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越来越复杂的WEB应用,需要保存一些用户状 ...

  8. [Akka]发送一条消息的内部流程

    本想通过了解一下Akka-actor工程中主要的类的概念,来看下Akka内部运作的机制.无奈里边的类的确太多,注释中对每个类的功能也没有足够的解释.所以还是通过debug的方式,找个入手点,看一下互相 ...

  9. python的web压力测试工具-pylot安装使用

    http://blog.csdn.net/chenggong2dm/article/details/10106517 pylot是python编写的一款web压力测试工具.使用比较简单.而且测试结果相 ...

  10. Git管理unity3d项目

    如果小组中没有足够的专业版license,用不了unity3d自带的version control,可以使用git来对项目进行版本控制:只不过需要建一个.gitignore文件在git项目管理的根目录 ...