HDOJ 5399 Too Simple
每个函数都必须是一个排列,经过连续的一段确定函数后数字不能少.
满足上面的条件的话,仅仅要有一个-1函数特别的排列一下就能够满足要求,剩下的能够任意填
没有-1的话特判
Too Simple
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 789 Accepted Submission(s): 267
Teacher Mai has m functions f1,f2,⋯,fm:{1,2,⋯,n}→{1,2,⋯,n}(that
means for all x∈{1,2,⋯,n},f(x)∈{1,2,⋯,n}).
But Rhason only knows some of these functions, and others are unknown.
She wants to know how many different function series f1,f2,⋯,fm there
are that for every i(1≤i≤n),f1(f2(⋯fm(i)))=i.
Two function series f1,f2,⋯,fm and g1,g2,⋯,gm are
considered different if and only if there exist i(1≤i≤m),j(1≤j≤n),fi(j)≠gi(j).
The following are m lines.
In i-th
line, there is one number −1 or n space-separated
numbers.
If there is only one number −1,
the function fi is
unknown. Otherwise the j-th
number in the i-th
line means fi(j).
3 3
1 2 3
-1
3 2 1
1HintThe order in the function series is determined. What she can do is to assign the values to the unknown functions.
/* ***********************************************
Author :CKboss
Created Time :2015年08月19日 星期三 10时25分44秒
File Name :HDOJ5399.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; typedef long long int LL;
const LL mod=1e9+7LL;
const int INF=50000000; int n,m;
int f[110][110]; int cn;
int color[110]; bool COLOR(int x,int c)
{
if(color[x]==c) return false;
color[x]=c; cn++;
return true;
} LL QuickPow(LL a,LL n)
{
LL e=1;
while(n)
{
if(n&1) e=(a*e)%mod;
a=(a*a)%mod;
n/=2;
}
return e%mod;
} bool used[110]; LL jc(LL n)
{
LL ret=1;
for(int i=2;i<=n;i++)
ret=(ret*i)%mod;
return ret%mod;
} bool check_P(int x,int L=1,int R=m)
{
if(used[x]==true) return false;
int nx=x;
for(int i=R;i>=L;i--)
{
nx=f[i][nx];
}
if(nx==x)
{
if(used[x]==false)
{
used[x]=true;
return true;
}
else return false;
}
return false;
} bool check_Range(int L,int R)
{
memset(used,false,sizeof(used));
bool flag=true;
for(int i=1;i<=n&&flag;i++)
{
int nx=i;
for(int j=R;j>=L;j--)
{
nx=f[j][nx];
}
if(used[nx]==true) return false;
else used[nx]=true;
}
return true;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF)
{
int nig=0;
bool check=true;
memset(color,0,sizeof(color)); for(int i=1;i<=m;i++)
{
scanf("%d",&f[i][1]);
if(f[i][1]==-1) nig++;
else
{
cn=0;
check=COLOR(f[i][1],i);
for(int j=2;j<=n;j++)
{
scanf("%d",&f[i][j]);
check=COLOR(f[i][j],i);
}
if(cn!=n) check=false;
}
} if(check==false)
{
puts("0");
}
else if(check&&nig==0)
{
/// tePan
memset(used,false,sizeof(used));
bool flag=true;
for(int i=1;i<=n&&flag;i++)
{
if(check_P(i)==false) flag=false;
}
if(flag==true) puts("1");
else puts("0");
}
else
{
//// (n!^(nig-1))
bool flag=true;
int Left=INF,Right=-INF;
f[m+1][1]=-1;
for(int i=1;i<=m+1&&flag;i++)
{
if(f[i][1]==-1)
{
if(Left!=INF&&Right!=-INF)
{
/// check;
flag=check_Range(Left,Right);
}
Left=INF; Right=-INF;
}
else
{
Left=min(Left,i); Right=max(Right,i);
}
}
if(flag==false) puts("0");
else printf("%lld\n",QuickPow(jc(n),nig-1)%mod);
}
} return 0;
}
HDOJ 5399 Too Simple的更多相关文章
- hdoj 5399 Tpp simple
WA了一下午.... 1WA:T了,因为阶乘没打表所以时间超了.. 2WA,3WA:runtime error,检查的value数组开小了,应该是MAXN.. 4WA.5WA.6WA:改了改对cnt的 ...
- 构造 HDOJ 5399 Too Simple
题目传送门 题意:首先我是懂了的,然后我觉得很难讲清楚就懒得写了,关键理解f1(f2(fm(i)))=i,不懂的戳这里构造:如果fi(j)不是映射到(1~n),重复或者不在范围内的肯定无解.还有没有- ...
- 【HDOJ 5399】Too Simple
pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...
- HDOJ 4974 A simple water problem
A simple water problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- HDU 5399 Too Simple(过程中略微用了一下dfs)——多校练习9
Too Simple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Probl ...
- HDOJ 4975 A simple Gaussian elimination problem.
和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...
- 【HDOJ】2451 Simple Addition Expression
递推,但是要注意细节.题目的意思,就是求s(x) = i+(i+1)+(i+2),i<n.该表达中计算过程中CA恒为0(包括中间值)的情况.根据所求可推得.1-10: 31-100: 3*41- ...
- 【HDOJ】1341 Simple Computers
注意PC要与31. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 40 ...
- 【HDOJ】1497 Simple Library Management System
链表. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXM 1001 #def ...
随机推荐
- 题解 CF1037D 【Valid BFS?】
不管怎么说,这都不是道紫题吧... 这里采用的思想有点类似轻重链剖分. 我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序. 这样(如果序列没错)肯定会按照序列的方式遍历完全图. ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 洛谷——P1970 花匠
https://www.luogu.org/problem/show?pid=1970 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走, ...
- Liquibase简介(1)
Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. Liquibase具备如下特性: * 不依赖于 ...
- Css 选择器总结
选择器 .class 类对应的元素. #id 对应的id元素. * 全部元素 div{} 对应的标签 div,p{} 全部的div和p div p{} div下全部的p标签 div>p{} di ...
- EChart报表插件使用笔记(1)
报表插件Echart java类 package com.spring.controller; import java.io.IOException; import java.util.Arrays; ...
- 用motion实现家庭视频监控
需求?当然不是为了艳照.你们这些猥琐的人类! 毕竟家里总会有没人的时候,出门走到半路忘记煤气灶是不是关了,还得回去看看. 在这个科技以人为本的时代,当然应该是拿出智能手机联网看看啦.还有万一有人闯空门 ...
- void指针 (补充)
void* 表示空指针.空指针不能直接使用,比如,指针的加减法操作(由于不知道类型,无法确定偏移的大小).某些情况下.不知道指针的类型,先用void*来取代,依据须要再强制转换成须要的指针类型使用. ...
- html&css基础笔记
有道笔记:http://note.youdao.com/noteshare?id=a6d7eab195085655bbfce86665524e35 一 HTML结构标签 HTML基本标签 标题标签 & ...
- Python(二) 表示‘组’的概念与定义
现实世界中总存在一组一组的事物, 一.列表的定义 type(['hello','world',1,9,True,False]) = <class 'list'> type([[1,2,3, ...