• 【HDU 5399】Too Simple


    Description

    Rhason Cheung had a simple problem, and asked Teacher Mai for help. But Teacher Mai thought this problem was too simple, sometimes naive. So she ask you for help.
    Teacher Mai has m functions f1,f2,...,fm:{1,2,...,n}→{1,2,...,n}(that means for all x∈{1,2,...,n},f(x)∈{1,2,...,n}.
    But Rhason only knows some of these functions, and others are unknown.
    She wants to know how many different function series f1,f2,...,fm there are that for every i(i≤1≤n),f1(f2(...(fm(i))...))=i. Two function series f1,f2,...,fm and g1,g2,...,gm are considered different if and only if there exist i(1≤i≤m), j(1≤j≤n),fi(j)≠gi(j)

    Input

    For each test case, the first lines contains two numbers n,m(1≤n,m≤100)The following are m lines. In i-th line, there is one number -1;or n space-separated numbers. 

    If there is only one number -1, the function fi is unknown. Otherwise the j-th number in the i-th line means fi(j)

    Output

    For each test case print the answer modulo 109+7.

    Sample Input

    3 3
    1 2 3
    -1
    3 2 1
     

    Sample Output

    1

    Hint

    The order in the function series is determined. What she can do is to assign the values to the unknown functions. 

    题意:

    求满足f1(f2(...(fm(i))...))=i的未知的函数有多少种可能。

    分析:

    答案是(n!)^(m-1)再mod 109+7,m为-1的个数,因为m个不确定的函数,其中的m-1个固定了,那么还有一个也就固定了。每个不确定的都有n!种方案。

    如果m为0,则有0种或者1种方案。也就是要看当前的一层一层能否推到f1(f2(...(fm(i))...))=i。

    要注意:当某个f里1..n没有全部出现时,即有重复数字时,答案是0。

    这题说是too simple,然而好多坑啊!样例只有一组数据,但是实际上可能有多组数据,除此,要注意每次处理新的一组时,哪些变量要清零,还有这题要用long long,n阶乘可以在一开始初始化。

    代码:

    #include<stdio.h>
    #define M 1000000007LL
    #define ll long long
    #define N 105
    #define F(a,b,c) for(int a=b;a<=c;a++)
    ll n,m,d,f[N][N],y[N],jc[N]={1,1},ans;
    int main()
    {
        F(i,2,100)jc[i]=jc[i-1]*i%M;//初始化阶乘
        while(~scanf("%lld%lld",&n,&m))
        {
            d=0;ans=1;//初始化
            F(i,1,m)
            {
                scanf("%lld",&f[i][1]);
                if(f[i][1]==-1)d++;
                else F(j,2,n)
                {
                    scanf("%lld",&f[i][j]);
                    if(ans)F(k,1,j-1)
                        if(f[i][j]==f[i][k])ans=0;
                }
            }
            if(ans)
            {
                if(d==0)
                {
                    F(i,1,n)y[i]=i;
                    for(int i=m; i; i--)
                       F(j,1,n)y[j]=f[i][y[j]];//一层层推到f1
                    F(i,1,n&&ans)if(y[i]!=i)ans=0;
                }
                else
                    F(i,1,d-1)ans=ans*jc[n]%M;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    [20160701]DevideByZeroWithoutNoException——from 《Java How To Program (Early Objects), 10th》
    Linux/Centos下安装部署phantomjs 及使用
    SVG中 transform矩阵遇到的兼容性问题
    jQuery中clone和clone(true)的区别
    彻底删除MySQL
    安卓工程师笔试--2015--波导公司
    如何查看、备份电脑隐藏的恢复分区
    效率以及时间维度
    数据集市设计
    Python学习之一:Python2.7与opencv2.4安装配置
  • 原文地址:https://www.cnblogs.com/flipped/p/5184399.html
Copyright © 2020-2023  润新知