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

来源:互联网 发布:气象数据查询 编辑:程序博客网 时间:2024/04/30 08:24

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-10using 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;}


1 0
原创粉丝点击