您的位置:首页 > 其它

HDU 5399

2015-08-18 20:11 211 查看
题意:给你n个数字,m个函数。每个函数满足,f1(f2(⋯fm(i)))=i
然后有可能函数的不给你,就是写出来-1.

让你自己给-1那行赋值,问你有多少种可能。

只有一个-1的时候肯定是1。
但是没有-1的时候还要看给你的函数 满不满足条件。
-1有k个。1行的种是N!个。
最后一个-1可以被其他已经赋值的-1确定。最后结果是N !^(k-1).

<span style="font-family: 'Times New Roman';">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
int num[101][111];
int dfs(int m,int x,int j)
{
//printf("%d %d %d\n",m,x,j);
if(m==0)
{
if(x==j)return 1;
return 0;
}
return dfs(m-1,num[m-1][x]-1,j);
}
int main()
{
int n,m,x,kj;
long long sum=0;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=1;
kj=0;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
scanf("%d",&num[i][j]);
if(num[i][j]==-1)
{
kj++;
break;
}
}
bool flag=true;
int f[1001];
for(int i=0; i<m; i++)
{
if(num[i][0]==-1)
continue;
memset(f,0,sizeof(f));
for(int j=0; j<n; j++)
{
f[num[i][j]]++;
if(f[num[i][j]]>1) flag=false;
}
}
if(kj==0)
for(int i=0; i<n; i++)
{
int t1=dfs(m-1,num[m-1][i]-1,i);
if(!t1) flag=false;
//printf("t1=%d\n",t1);
}
//  printf("%d\n",flag);
if(flag==false)
{
puts("0");
continue;
}
if(kj<=1)
{
printf("1\n");
}
else
{
long long s=1;
for(int i=1; i<=n; i++)
{
s*=i;
s%=mod;
}
for(int i=1; i<kj; i++)
{
sum*=s;
sum%=mod;
}
printf("%lld\n",sum);
}
}
return 0;
}

</span>


f1(f2(⋯fm

(i)))=i

f

i

f

i
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: