HDU 5399

来源:互联网 发布:android json 编辑:程序博客网 时间:2024/06/05 21:11
题意:给你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

fifi

0 0
原创粉丝点击