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 ...
随机推荐
- DOM所有的命令(CMD)
刚接触电脑的时候是从DOS系统开始,DOS时代根本就没有Windows这样的视窗操作界面,只有一个黑漆漆的窗口,让你输入命令.所以学DOS系统操作,cmd命令提示符是不可或缺的.可以告诉大家,大多数的 ...
- Arduino ESP8266编程深入要点
Arduino for ESP8266的话,如果不修改代码,默认没有办法进入轻睡眠的省电模式,只能进入Modem Sleep,也就是说Wifi可以暂时睡眠但是CPU没法睡,Modem Sleep最低功 ...
- 家校通Code
9 http://dlwt.csdn.net/fd.php?i=621573845033702&s=44d46a459acce7fef39aa4dcff51bfba
- Netweaver和CloudFoundry的服务器日志
Netweaver 事务码SMICM,Goto->HTTP Plug-In->Server Logs: CloudFoundry 假设我部署本地应用到CloudFoundry之后,应用的状 ...
- CF Gym 100187M Heaviside Function(二分)
题意:给你一个函数和一些系数,给你一堆询问,求函数值. 根据s的符号,分成两组讨论,函数值与比x小的系数数量有关,二分输出答案. #include<cstdio> #include< ...
- [Java] 新手快速就业需要掌握的知识点
目的:主要是分享下日常工作中使用到的技术点,根据二八定律快速掌握使用知识点,先就业再沉淀去积累经验.(个人建议仅供参考) 背景:目前一般来说,都是前后端分离.你只需要提供接口给前端,他来处理就可以了, ...
- 使用Timer组件实现倒计时
实现效果: 知识运用: Timer组件的Enabed属性 实现代码: private void timer1_Tick(object sender, EventArgs e) { DateTime ...
- python_104_面向对象总结
参考(都要认真看看):http://www.cnblogs.com/alex3714/articles/5188179.html http://www.cnblogs.com/alex3714/art ...
- python_93_面向对象实例2
class Role: def __init__(self,name,role,weapon,life_value=100,money=15000): '构造函数:实例化时做一些类的初始化工作' se ...
- _variant_t的使用
我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法: _co ...