HDU 6038 Function 【置换群】

来源:互联网 发布:添加数组中的指定元素 编辑:程序博客网 时间:2024/06/06 06:43

Function

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1588    Accepted Submission(s): 746


Problem Description
You are given a permutation a from 0 to n1 and a permutation b from 0 to m1.

Define that the domain of function f is the set of integers from 0 to n1, and the range of it is the set of integers from 0 to m1.

Please calculate the quantity of different functions f satisfying that f(i)=bf(ai) for each i from 0 to n1.

Two functions are different if and only if there exists at least one integer from 0 to n1 mapped into different integers in these two functions.

The answer may be too large, so please output it in modulo 109+7.
 

Input
The input contains multiple test cases.

For each case:

The first line contains two numbers n, m(1n100000,1m100000)

The second line contains n numbers, ranged from 0 to n1, the i-th number of which represents ai1.

The third line contains m numbers, ranged from 0 to m1, the i-th number of which represents bi1.

It is guaranteed that n106, m106.
 

Output
For each test case, output "Case #xy" in one line (without quotes), where x indicates the case number starting from 1 and y denotes the answer of corresponding case.
 

Sample Input
3 21 0 20 13 42 0 10 2 3 1
 

Sample Output
Case #1: 4Case #2: 4
 

Source
2017 Multi-University Training Contest - Team 1
 



#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<stack>#include<vector>#include<map>#include<set>#include<algorithm>using namespace std;#define ll long long#define ms(a,b)  memset(a,b,sizeof(a))#define maxn 510const int M=1e6+10;const int inf=0x3f3f3f3f;const int mod=1e9+7;const double eps=1e-10;ll n,m;ll a[M];ll b[M];ll sum1[M];ll sum2[M];ll k;int main(){   int cas=1;   while(~scanf("%lld%lld",&n,&m)){     for(int i=0;i<n;i++)scanf("%lld",&a[i]);     ll ans1=0;     for(int i=0;i<n;i++){        ll sum=0;        k=i;        while(a[k]!=-1){            sum++;            ll t=a[k];            a[k]=-1;            k=t;        }       if(sum) sum1[ans1++]=sum;     }     for(int i=0;i<m;i++)scanf("%lld",&b[i]);     ms(sum2,0);     for(int i=0;i<m;i++){        ll sum=0;        k=i;        while(b[k]!=-1){            sum++;            ll t=b[k];            b[k]=-1;            k=t;        }       if(sum) sum2[sum]++;     }     ll ans=1;     for(int i=0;i<ans1;i++){        ll anss=0;        for(int j=1;j*j<=sum1[i];j++){            if(sum1[i]%j==0){                if(j*j==sum1[i])                    anss+=j*sum2[j];                else anss+=j*sum2[j]+sum1[i]/j*sum2[sum1[i]/j];            }        }        ans=(ans*anss)%mod;     }     printf("Case #%d: %lld\n",cas++,ans);   }   return 0;}


原创粉丝点击