HDU 5399 数学 Too Simple
题意:有m个1~n的映射,而且对于任意的 i 满足 f1(f2(...fm(i))) = i
其中有些映射是知道的,有些是不知道的,问一共有多少种置换的组合。
分析:
首先这些置换一定是1~n的一个置换(也就是1~n的一个排列)才行,因为如果某两个数映射到同一个数的话,那么这个数往后无论怎么映射,这两个数最终映射的结果还是一样的。
如果所有的f都给出来的话,那么只要判断一下就行。
如果有一个置换不知道的话,这个置换是可以通过前后的置换计算出来的,所以只有唯一解。
如果有两个置换不知道的话,第一个置换可以任意确定,有n!种情况,第二个置换根据第一个置换确定。
以此类推,有c个未知的置换的话,其中c-1个可以自由确定,而且互补影响,最后一个置换根据前面所有置换唯一确定,所以中的方案数是(n!)c-1
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long LL; const int maxn = + ;
const LL MOD = ; int n, m;
bool vis[maxn];
int a[maxn][maxn]; inline LL mul_mod(LL a, LL b) { return a * b % MOD; } LL pow_mod(LL a, int n)
{
LL ans = 1LL, base = a;
while(n)
{
if(n & ) ans = mul_mod(ans, base);
base = mul_mod(base, base);
n >>= ;
}
return ans;
} LL fac[maxn]; int main()
{
fac[] = ;
for(int i = ; i < maxn; i++) fac[i] = fac[i - ] * i % MOD; while(scanf("%d%d", &n, &m) == && n)
{
int cnt = ;
bool ok = true;
for(int i = ; i <= m; i++)
{
scanf("%d", &a[i][]);
if(a[i][] == -) { cnt++; continue; }
for(int j = ; j <= n; j++) scanf("%d", &a[i][j]);
memset(vis, false, sizeof(vis));
for(int j = ; j <= n; j++)
{
if(vis[a[i][j]]) { ok = false; break; }
vis[a[i][j]] = true;
}
}
if(!ok) { puts(""); continue; } if(!cnt)
{
bool ok = true;
for(int i = ; i <= n; i++)
{
int t = i;
for(int j = m; j >= ; j--) t = a[j][t];
if(t != i) { ok = false; break; }
}
if(ok) puts(""); else puts("");
}
else printf("%I64d\n", pow_mod(fac[n], cnt - ));
} return ;
}
代码君
HDU 5399 数学 Too Simple的更多相关文章
- 【HDU 5399】Too Simple
题 Description Rhason Cheung had a simple problem, and asked Teacher Mai for help. But Teacher Mai th ...
- HDU 5984 数学期望
对长为L的棒子随机取一点分割两部分,抛弃左边一部分,重复过程,直到长度小于d,问操作次数的期望. 区域赛的题,比较基础的概率论,我记得教材上有道很像的题,对1/len积分,$ln(L)-ln(d)+1 ...
- 【HDOJ 5399】Too Simple
pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...
- HDU 5399 Too Simple(过程中略微用了一下dfs)——多校练习9
Too Simple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Probl ...
- HDU 5399 Too Simple (2015年多校比赛第9场)
1.题目描写叙述:点击打开链接 2.解题思路:本题分情况讨论.比赛时候真是想的太简单了.以为就是(n!)^(cnt-1). 终于无限WA. 本题有几个特殊情况须要额外推断. 首先,假设输入的时候.有某 ...
- *HDU 2451 数学
Simple Addition Expression Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 5795:A Simple Nim(博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5795 A Simple Nim Problem Description Two players take t ...
- hdu 5349 MZL's simple problem
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5349 MZL's simple problem Description A simple proble ...
- hdu 1851(A Simple Game)(sg博弈)
A Simple Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Tot ...
随机推荐
- MVC View与Controller分离
新建了一个 Separate 解决方案, 如下图 Separate.UI UI层. 引用 Separate.Home Separate.Home 把Home控制器分享到 一个类库中 并引用(Sy ...
- HandlerMapping执行过程。。。
1.web.xml DispatcherServlet 类 寻址 doDispatch() 2.getHandler(requset) 点击,进入 3.HandlerMapping hm=xxxxxx ...
- BZOJ3004: 吊灯(结论 毒瘤)
题意 $n$个节点的树,判断能否划分成$\frac{n}{k}$个大小为$k$的联通块 Sol 首先$k$必须是$n$的倍数. 然后刚开始我就非常傻的以为输出所有约数就行了.. 但是图是这样,$k = ...
- cpu 满载测试软件
for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...
- Linux:linux下建ftp用户,并限制用户访问路径
安装:ftp安装部分,操作步骤如下: 可以使用yum命令直接安装ftp # yum install vsftpd ftp服务的开启与关闭命令: 开启:# service vsftpd start 关闭 ...
- SQL Server Sleeping会话占用内存资源浅析?
在SQL Server中,会话的状态有运行(Running).睡眠(Sleeping).休眠(Dormant).Preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(Sleepi ...
- Java之栈空间和堆空间
1.变量的命名 (1)由字母,数字和下划线构成,首字母以字母或下划线开头 (2)变量的命名遵循见名知义 (3)Java变量命名建议不用中文 (4)变量名首字母建议不用大写字母开头 (5)用驼峰命名法命 ...
- 通过CMD命令行创建和使用Android 模拟器 AVD
进行Android APP测试时,若手持android手机设备稀少的情况下,我们可以通过创建Android模拟器AVD来代替模拟android手机设备,本文就具体介绍如何创建和使用AVD. 1.创建A ...
- javaSe-线程
package com.java.chap09.sec02; public class Thread1 extends Thread{ private int baoZi=1; private Str ...
- RYU的GUI安装
1. RYU安装 Ubuntu14.04 LTS 1.sudo apt-get install git python-pip libxml2-dev libxslt1-dev python2.7-de ...