HDU 5399

题意:给你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

你可能感兴趣的:(HDU 5399)