hdu5399 Too Simple(推论,分类讨论)

http://acm.hdu.edu.cn/showproblem.php?pid=5399

题解:http://blog.csdn.net/queuelovestack/article/details/47753497

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 105;
const int inf = 1000000000;
const int mod = 1000000007;
__int64 s[N];
bool v[N];
int w[N][N];
int dfs(int t,int x)
{
    if(t==1)
        return w[t][x];
    return dfs(t-1,w[t][x]);
}
int main()
{
    int n,m,i,j,k,x;
    bool flag;
    __int64 ans;
    s[0]=1;
    for(i=1;i<N;i++)
        s[i]=(s[i-1]*i)%mod;
    while(~scanf("%d%d",&n,&m))
    {
        flag=true;
        for(k=0,i=1;i<=m;i++)
        {
            scanf("%d",&x);
            if(x==-1)
                k++;
            else
            {
                memset(v,false,sizeof(v));
                v[x]=true;w[i][1]=x;
                for(j=2;j<=n;j++)
                {
                    scanf("%d",&x);
                    v[x]=true;
                    w[i][j]=x;
                }
                for(j=1;j<=n;j++)
                    if(!v[j])  //因为这一层的下标是上一层的数组值,所以上一层值必然是1~n 
                        break;
                if(j<=n)
                    flag=false;
            }
        }
        if(!flag)
            puts("0");
        else if(!k)  //没有-1的时候 
        {
            for(i=1;i<=n;i++)
                if(dfs(m,i)!=i)
                    break;
            if(i>n)
                puts("1");
            else
                puts("0");
        }
        else
        {
            for(ans=1,i=1;i<k;i++)
                ans=ans*s[n]%mod;
            printf("%I64d\n",ans);
        }
    }
    return 0;
}


你可能感兴趣的:(hdu5399 Too Simple(推论,分类讨论))