题意:有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 ;
}

代码君

最新文章

  1. nginx的日常应用
  2. SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法
  3. js中typeof与instanceof区别
  4. 提高Python运行效率的六个窍门
  5. HDFS原理讲解
  6. HTML 的 iframe 元素
  7. hdu 5113 Black And White
  8. 魔法方法:算术运算 - 零基础入门学习Python042
  9. 使用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡出现的无法加载mod_jk.conf文件的问题
  10. MySQL查询order by相减select相减的Sql语句
  11. 用JavaScript 来将数字转换成字符。
  12. Nagios邮件报警
  13. 原创: rsync软件服务利用ansible实现一键化部署
  14. Akka(28): Http:About Akka-Http
  15. java的Xmx是设置什么的?
  16. windows环境下,spring boot服务使用docker打包成镜像并推送到云服务器私有仓库
  17. MongoDB 入门篇
  18. 躲不掉的 lambda 表达式
  19. .Net Core 项目在Windows服务中托管【转载】
  20. 压缩归档文件审查工具p7zip-full

热门文章

  1. 介绍我最近做的网站 Asp.Net MVC4 + BootStrap
  2. filter配置多个url-pattern和排除个别servlet
  3. Spring的七种事务传播机制
  4. pageContext.setAttribute的使用场合
  5. 小技巧:在向导式页面设计中使用hidden型输入可以避免session的使用
  6. 使用jdbc完成curd操作
  7. Oracle关于TX锁的一个有趣的问题
  8. 重写strcpy函数,以实现strcpy的功能
  9. UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)
  10. Luogu [P3951] 小凯的疑惑