HDU 5399Too Simple
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5399Too Simple相关的知识,希望对你有一定的参考价值。
Description
Rhason Cheung had a simple problem, and asked Teacher Mai for help. But Teacher Mai thought this problem was too simple, sometimes naive. So she ask you for help.Input
For each test case, the first lines contains two numbers n,m(1≤n,m≤100)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)
Output
Sample Input
Sample Output
Hint
The order in the function series is determined. What she can do is to assign the values to the unknown functions.
题意:
求满足f1(f2(...(fm(i))...))=i的未知的函数有多少种可能。
分析:
因为只要最后的那个fi确定了,其它的任意都可以,答案是(n!)^(m-1)再mod 109+7,m为-1的个数
但是要注意只有一个-1时,答案可能是0或1,而当f里1..n没有全部出现时,即有重复数字时,答案也是0。
这题说是too simple,然而好多坑啊!样例只有一组数据,但是实际上可能有多组数据,除此,要注意每次处理新的一组时,哪些变量要清零,还有这题要用long long,n阶乘可以在一开始初始化。
代码:
#include<stdio.h> #define M 1000000007LL #define ll long long #define N 105 #define F(a,b,c) for(int a=b;a<=c;a++) ll n,m,d,f[N][N],y[N],jc[N]={1,1},ans; int main() { F(i,2,100)jc[i]=jc[i-1]*i%M;//初始化阶乘 while(~scanf("%lld%lld",&n,&m)) { d=0;ans=1;//初始化 F(i,1,m) { scanf("%lld",&f[i][1]); if(f[i][1]==-1)d++; else F(j,2,n) { scanf("%lld",&f[i][j]); if(ans)F(k,1,j-1) if(f[i][j]==f[i][k])ans=0; } } if(ans) { if(d==0) { F(i,1,n)y[i]=i; for(int i=m; i; i--) F(j,1,n)y[j]=f[i][y[j]];//一层层推到f1 F(i,1,n&&ans)if(y[i]!=i)ans=0; } else F(i,1,d-1)ans=ans*jc[n]%M; } printf("%lld\n",ans); } return 0; }
以上是关于HDU 5399Too Simple的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ 4999]This Problem Is Too Simple!
BZOJ 4999 This Problem Is Too Simple!
bzoj 4999 This Problem Is Too Simple!