hdu 5399 Too Simple 2015多校联合训练赛#9 模拟

Too Simple

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 797    Accepted Submission(s): 268


Problem 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(1in), 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(1im),j(1jn), fi(j)gi(j).
 

Input
For each test case, the first lines contains two numbers  n,m(1n,m100).

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.
 

Author
xudyh
 

Source
2015 Multi-University Training Contest 9


如果有-1,且函数合法,那么就有(N!)^(x-1),x是-1的个数

否则只需要判断函数映射是否会x= f(f(f....f(x))即可

函数合法的条件是:y = f(x) y包含1到n的每个数字


#include
#include
#include
#include
using namespace std;

int f[101][101];
#define ll long long
int jie[101];
int mod = 1000000007;
int ans[101];
int main(){
    int n,m;
    jie[0]  = 1;
    for(int i =1; i <= 100;i++)
        jie[i] =1ll*jie[i-1]*i%mod;
    while(scanf("%d%d",&n,&m)!=EOF){
        int res = 0;
        for(int i = 0;i < m; i++){
            scanf("%d",&f[i][1]);
            if(f[i][1] == -1) {
                res++;
                continue;
            }
            for(int j = 2;j <= n; j++)
                scanf("%d",&f[i][j]);
        }
        if(res == 0){
            for(int i = 1;i <= n; i++)
                ans[i] = i;
            for(int i = m-1; i >= 0; i--)
                for(int j = 1;j <= n; j++)
                    ans[j] = f[i][ans[j]];
            res = 1;
            for(int i = 1;i <= n; i++)
                if(ans[i] != i ) res = 0;
            if(res)puts("1");
            else puts("0");
        }
        else {
            int flag = 1;
            for(int i = 0;i < m && flag; i++){
                if(f[i][1] == -1) continue;
                memset(ans,0,sizeof(ans));
                for(int j = 1;j <= n;j++)
                    ans[f[i][j]] = 1;
                for(int j = 1;j <= n;j++)
                    if(ans[j] == 0)
                        flag = 0;
            }
            if(flag == 0) puts("0");
            else {
                ll t = 1;
                for(int i = 1;i < res; i++){
                    t = t*jie[n]%mod;
                }
                cout<


你可能感兴趣的:(##ACM-ICPC编程题,##模拟,ACM之2015多校联合训练赛)