题
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)
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; }