Function
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1557 Accepted Submission(s): 738
Problem Description
You are given a permutation
a from
0 to
n−1 and a permutation
b from
0 to
m−1.
Define that the domain of function f is the set of integers from 0 to n−1, and the range of it is the set of integers from 0 to m−1.
Please calculate the quantity of different functions f satisfying that f(i)=bf(ai) for each i from 0 to n−1.
Two functions are different if and only if there exists at least one integer from 0 to n−1 mapped into different integers in these two functions.
The answer may be too large, so please output it in modulo 109+7.
Define that the domain of function f is the set of integers from 0 to n−1, and the range of it is the set of integers from 0 to m−1.
Please calculate the quantity of different functions f satisfying that f(i)=bf(ai) for each i from 0 to n−1.
Two functions are different if and only if there exists at least one integer from 0 to n−1 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. (1≤n≤100000,1≤m≤100000)
The second line contains n numbers, ranged from 0 to n−1, the i-th number of which represents ai−1.
The third line contains m numbers, ranged from 0 to m−1, the i-th number of which represents bi−1.
It is guaranteed that ∑n≤106, ∑m≤106.
For each case:
The first line contains two numbers n, m. (1≤n≤100000,1≤m≤100000)
The second line contains n numbers, ranged from 0 to n−1, the i-th number of which represents ai−1.
The third line contains m numbers, ranged from 0 to m−1, the i-th number of which represents bi−1.
It is guaranteed that ∑n≤106, ∑m≤106.
Output
For each test case, output "
Case #x: y" 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 2 1 0 2 0 1 3 4 2 0 1 0 2 3 1
Sample Output
Case #1: 4 Case #2: 4
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf = 1e9; const int mod = 1e9+7; int book[111111]; int ans[111111]; int ans2[111111]; ll quick_pow(ll a,ll b){ ll ans = 1; while(b){ if(b&1) ans = (ans*a) % mod; b >>= 1; a = (a*a) % mod; } return ans; } int main(){ std::ios::sync_with_stdio(false); int n,m; int caset = 0; while(cin>>n>>m){ int ansc[111111] = {0}; int cnt = 0; for(int i=0; i<n; i++) cin>>book[i]; int mapp[111111] = {0}; for(int i=0; i<n; i++) if(!mapp[i]){ int count = 0; int tmp = i; do{ mapp[tmp] = 1; tmp = book[tmp]; count++; }while(tmp != i); int flag = 0; for(int j=0; j<cnt; j++){ if(ans[j] == count) ansc[j]++,flag = 1; } if(!flag){ ans[cnt++] = count; ansc[cnt-1]++; } } int ans2c[111111] = {0}; int cnt2 = 0; for(int i=0; i<m; i++) cin>>book[i]; memset(mapp, 0, sizeof(mapp)); for(int i=0; i<m; i++) if(!mapp[i]){ int count = 0; int tmp = i; do{ mapp[tmp] = 1; tmp = book[tmp]; count++; }while(tmp != i); int flag = 0; for(int j=0; j<cnt2; j++){ if(ans2[j] == count) ans2c[j]++,flag = 1; } if(!flag){ ans2[cnt2++] = count; ans2c[cnt2-1]++; } } ll anss = 1; for(int i=0; i<cnt; i++){ ll tmp = 0; for(int j=0; j<cnt2; j++) if(ans[i]%ans2[j] == 0) tmp += ans2c[j]*ans2[j] % mod; anss =( anss * quick_pow(tmp, ansc[i]) ) %mod; } cout<<"Case #"<<++caset<<": "; cout<<anss<<endl; } }