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 n−1 and a permutation b from 0 to m−1 .
Define that the domain of functionf 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 functionsf 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 from0 to n−1 mapped into different integers in these two functions.
The answer may be too large, so please output it in modulo109+7 .
Define that the domain of function
Please calculate the quantity of different functions
Two functions are different if and only if there exists at least one integer from
The answer may be too large, so please output it in modulo
Input
The input contains multiple test cases.
For each case:
The first line contains two numbersn, m . (1≤n≤100000,1≤m≤100000)
The second line containsn numbers, ranged from 0 to n−1 , the i -th number of which represents ai−1 .
The third line containsm 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
The second line contains
The third line contains
It is guaranteed that
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 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;}
阅读全文
0 0
- HDU 6038 Function 置换群
- HDU 6038 Function 【置换群】
- hdu 6038 Function【置换群进阶】
- HDU 6038 Function(置换->循环节)
- HDU6038-Function(置换群)
- 2017 多校 Function(置换群
- hdu 4259 置换群
- HDU-置换群
- HDU 5495 置换群
- HDU 5495(置换群)
- hdu 置换群
- 【HDU】1439 Cipher 置换群
- hdu 5495 LCS 置换群
- 【HDU 1439】Cipher(置换群)
- hdu 4529 Double Dealing (置换群)
- HDU 4259 Double Dealing【简单群置换】
- HDU 5495 LCS (置换群)
- HDU 5495 LCS(置换群)
- 对NOSQL学习的理解
- 将caffe变成crop长宽不同的大小
- Mongo进阶--Security安全介绍
- 修改Tomcat 端口号
- 利用sklearn训练LDA主题模型及调参详解
- HDU 6038 Function 【置换群】
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- 【步骤向】Revit二次开发 Hello World
- 使用Spring Boot开发Restful程序
- ACM ICPC 2008–2009, NEERC, Problem F Fenwick Tree(找规律,打表) Codeforces Gym 100623F
- strcmp与strncmp()的用法
- JSONObject和JSONArray的使用
- 1033. 旧键盘打字
- RecyclerView的条目拖拽和条目滑动