pid=5399">【HDOJ 5399】Too Simple

函数映射问题 给出m函数 里面有0~m个函数未知(-1)

问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的函数不可变 仅仅可更改未知的函数的映射)

假设映射过程中出现多对一 即入度n出度小于n 的函数 必然冲突 即最后必有落单 映射失败 为0

假设映射完整 已知的连续函数可压缩成一个函数 中间出入度可忽略 因此可压缩为-1 f -1 -1 f -1 -1 f这样的形态 进一步深入可发现中间的f仅仅起到通道作用 就可以压缩为连续的-1之间的映射 已知的函数仅仅起到”折射作用” 假设一段连续的函数相应为

1 2 3

3 2 1

仅仅是进行了扭曲 消除后不影响方案数 即经过与否不重要

连续的-1构成的方案数为 n!^(x-1) x为-1的个数

代码例如以下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#define sc "%lld\n"
#define ll long long
#define mod 1000000007 using namespace std; ll a[101] = { 1, 1};
int f[101][101]; ll pow(ll x,int cnt)
{
int i;
ll ans = 1;
for(i = 0; i < cnt; ++i) ans = ans*x%mod;
return ans;
} int main()
{
int n,m,i,j,cnt,x;
bool isok;
for(i = 2; i <= 100; ++i) a[i] = a[i-1]*i%mod; while(~scanf("%d %d",&n,&m))
{
cnt = 0;
isok = 1;
for(i = 1; i <= m; ++i)
{
scanf("%d",&f[i][1]);
set <int> s;
s.insert(f[i][1]);
if(~f[i][1])
{
for(j = 2; j <= n; ++j)
{
scanf("%d",&f[i][j]);
s.insert(f[i][j]);
}
if(s.size() < n) isok = 0;
}
else cnt++;
} if(!isok) puts("0");
else if(cnt) printf(sc,pow(a[n],(cnt-1)));
else
{
for(i = 1; i <= n; ++i)
{
x = i;
for(j = m; j >= 1; --j)
{
x = f[j][x];
}
if(x != i) break;
}
if(i != n+1) puts("0");
else puts("1");
}
}
return 0;
}

【HDOJ 5399】Too Simple的更多相关文章

  1. 【HDU 5399】Too Simple

    题 Description Rhason Cheung had a simple problem, and asked Teacher Mai for help. But Teacher Mai th ...

  2. 一本通1548【例 2】A Simple Problem with Integers

    1548:[例 2]A Simple Problem with Integers 题目描述 这是一道模板题. 给定数列 a[1],a[2],…,a[n],你需要依次进行 q 个操作,操作有两类: 1 ...

  3. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  4. 【HDOJ 2089】不要62

    [HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...

  5. 【HDOJ 5371】 Hotaru&#39;s problem

    [HDOJ 5371] Hotaru's problem Manacher算法+穷举/set Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/de ...

  6. 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)

    pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...

  7. 【HDOJ 3652】B-number

    [HDOJ 3652]B-number 给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化! . 一入记忆化深似海. ..再也不想用递推了...发现真的非常好想 仅仅要保证满 ...

  8. 【HDOJ 5419】 Victor and Toys (排列组合)

    [HDOJ 5419] Victor and Toys n个玩具 m个区间 每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值 预处理一个数组 存放每 ...

  9. 【HDOJ 2255】奔小康赚大钱(KM算法)

    [HDOJ 2255]奔小康赚大钱(KM算法) 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

随机推荐

  1. $(addprefix PREFIX,NAMES…)

    addprefix 是makefile中的函数,是添加前缀的函数例如:$(addprefix src/,foo bar) 返回值为“src/foo src/bar”.所以上面的意思是为dirver_d ...

  2. PAT Basic 1071

    1071 小赌怡情 常言道“小赌怡情”.这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩家猜对了,则 ...

  3. Mac 生成public_key

    1.首先查看是否已经生成过public_key 打开终端查看是否已经存在SSH密钥:cd ~/.ssh 输出:No such file or directory表示没有 2.生成public_key ...

  4. 【工具】Homebrew的安装及使用

    Homebrew官网:http://brew.sh/index_zh-cn.html Homebrew是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于linux下的a ...

  5. c++ - 在终端中,cout不显示任何内容

    g++ 是一个编译器,它将源代码转换成可以执行程序,但不运行它. 你必须亲自运行程序. g++ 生成的程序的默认名称是 a.out ( 因为历史原因),因此你将运行它作为 $./a.out   如果要 ...

  6. Leetcode 407.接雨水

    接雨水 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高度都大于0 且小 ...

  7. 【JavaScript 12—应用总结】:弹出登录框

    导读:上篇博客中,做好了个人中心的下拉菜单,这次,将做每个网站都会有的一个登录功能,以此类推,可以做出别的想要的弹出框,如错误提示啦,或者注册. 一.实现分析 首先:和下拉菜单一样,需要通过CSS样式 ...

  8. HDU——4549M斐波那契数列(矩阵快速幂+快速幂+费马小定理)

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Su ...

  9. 启动uwsgi报错error while loading shared libraries: libpcre.so.1:

    启动uwsgi时候报错: [root@ richie]# /usr/bin/uwsgi --ini /usr/local/nginx/conf/uwsgi.ini /usr/bin/uwsgi: er ...

  10. intellij idea 使用用到的问题

    1.github error setting certificate verify locations使用github时报错,解决方法: git config --system http.sslcai ...