Function HDU
来源:互联网 发布:sql server创建表 编辑:程序博客网 时间:2024/06/05 08:30
[题目链接](http://acm.hdu.edu.cn/showproblem.php?pid=6038)
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 1e9+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 test case, output " Case #x: y" in one line (without quotes), where x indicates the case number starting from 1 and ydenotes 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
题意:
给出两个序列 a 和 b ,求满足
思路:
根据样例 1 我们可以得到:
官方题解很清楚
代码:
#include<bits/stdc++.h>using namespace std;typedef long long LL;const int mod = 1e9+7;const int maxn = 1e5 + 10;int a[maxn],b[maxn];bool vis[maxn];vector<int> q1,q2;int main(){ int n, m; int kase = 0; while(scanf("%d %d", &n, &m) != EOF){ for(int i = 0; i < n; ++i) scanf("%d", a+i); for(int i = 0; i < m ;++i) scanf("%d", b+i); printf("Case #%d: ", ++kase); memset(vis,false,sizeof(vis)); q1.clear(); q2.clear(); for(int i = 0; i < n; ++i){ int cur = i; int cnt = 1; if(vis[i]) continue; while(a[cur] != i){ cur =a[cur]; vis[cur] = true; ++cnt; }q1.push_back(cnt); }memset(vis,false,sizeof(vis)); for(int i = 0; i < m; ++i){ int cur = i; int cnt = 1; if(vis[i]) continue; while(b[cur] != i){ cur =b[cur]; vis[cur] = true; ++cnt; }q2.push_back(cnt); }int ans = 1; int len1 = q1.size(); int len2 = q2.size(); for(int i = 0; i < len1; ++i){ int res = 0; for(int j = 0; j < len2; ++j) if(q1[i] % q2[j] == 0) res = (res + q2[j]) % mod; ans = ans * res % mod; }printf("%d\n",ans); }return 0;}
阅读全文
0 0
- HDU-Function
- Function HDU
- HDU The Euler function
- hdu --- The Euler function
- HDU 3903 - Trigonometric Function
- hdu 3903 Trigonometric Function
- HDU 5609 function
- HDU 3903 Trigonometric Function
- HDU 5674 Function
- HDU 5875 Function
- hdu 5875 Function(multiset)
- HDU 5875 Function
- HDU 5875 Function
- HDU-5875-Function
- HDU 5875 - Function
- HDU 5875 Function
- HDU Function Run Fun
- [杜教筛] HDU 5608 function
- Ubuntu14.04在python中安装CRF++
- Vue关于install自定义全局插件
- thinkphp 修改后的数据和原数据一样,save方法返回值
- 在C++中,有哪4个与类型转换相关的关键字?这些关键字各有什么特点,应该在什么场合下使用?
- MFC的Main函数跑哪去了
- Function HDU
- MUI在登陆页面重写back方法,使得用户点击手机返回键不会返回其它页面
- JNI调用的helloworld(JNI_OnLoad映射方式)
- Windows下 where命令
- Android.mk模板
- Spring源码学习环境搭建
- Android源码编译常见错误(持续更新)
- fedora kde桌面系统配置
- 关于设计