HDU 6038 函数问题
来源:互联网 发布:自然排名优化软件 编辑:程序博客网 时间:2024/06/01 18:50
Function
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1649 Accepted Submission(s): 773
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
给你一个a序列,代表0到n-1的排列;一个b序列代表0到m-1的排列。问你可以找出多少种函数关系,满足f(i)=b[f(a[i])];
分析:这个主要是找循环节
比如说:如果 a 序列是 2 0 1 那么我们可以发现
f(0) = b[f(a[0])] = b[f(2)]
f[1] = b[f(a[1])] = b[f(0)]
f[2] = b[f(a[2])] = b[f(1)]
那么f(0) f(1) f(2) 也是循环的 如果想找出这样的函数,必须值域里也存在同样长度的循环节或者存在其约数长度的循环节。
那么就是找两个序列的循环节,对于定义域里面的每一个循环节都找出来有多少种和他对应的。最后乘起来就是答案了
#include<stdio.h>#include<string.h>#include<vector>using namespace std;#define ll long long#define mod 1000000007#define N 100050vector<int>vec;vector<int>F[N];void init(){for(int i = 1;i <= N - 10;i++){for(int j = i;j <= N - 10;j += i){F[j].push_back(i);}}}int a[N],b[N],vis[N],blen[N];int dfs(int x,int *p){if(vis[x])return 0;vis[x] = 1;return dfs(p[x],p) + 1;}int main(){int n,m,Case = 1;init();while(scanf("%d %d",&n,&m) != EOF){vec.clear();for(int i = 0;i < n;i++){scanf("%d",&a[i]);}for(int i = 0;i < m;i++){scanf("%d",&b[i]);}memset(vis,0,sizeof(vis));for(int i = 0;i < n;i++){if(!vis[i]){vec.push_back(dfs(i,a));}}memset(vis,0,sizeof(vis));memset(blen,0,sizeof(blen));for(int i = 0;i < m;i++){if(!vis[i]){blen[dfs(i,b)]++;}}ll ans = 1;for(int i = 0;i < vec.size();i++){ll temp = 0;for(int j = 0;j < F[vec[i]].size();j++){temp += F[vec[i]][j] * blen[F[vec[i]][j]];temp %= mod;}ans *= temp;ans %= mod;}printf("Case #%d: %lld\n",Case++,ans);}}
阅读全文
0 1
- HDU 6038 函数问题
- hdu 钱币兑换问题(母函数)
- HDU 2082 找单词 母函数问题
- HDU 2082 找单词 [母函数问题]
- HDU 2110 Crisis of HDU (母函数问题)
- hdu 2065 "红色病毒"问题 (母函数)
- hdu-1284-钱币兑换问题(母函数)
- HDU 2065 "红色病毒"问题 指数生成函数
- hdu 1284 钱币兑换问题(完全背包 母函数)
- 指数型母函数&&hdu 2065 "红色病毒"问题
- HDU 1284 钱币兑换问题(母函数)
- HDU 1284 钱币兑换问题(母函数,完全背包)
- HDU 2588 NOJ 1126 GCD 欧拉函数应用问题
- hdu 1284 钱币兑换问题(母函数)
- 母函数简介及简单使用(附HDU 1284 钱币兑换问题 解题报告)
- 母函数简介及简单使用(附HDU 1284 钱币兑换问题 解题报告)
- HDU 1059 物品价值平分问题,母函数或者多重背包 与 2844类似
- hdu 2152 Fruit 【分组背包解母函数——滚动数组优化陷阱问题】
- HDU 2026
- spring容器初始化的时候执行一个方法。
- jdbc深入~连接池
- Android开发动态添加标签
- DOM节点删除之remove()的有参用法和无参用法
- HDU 6038 函数问题
- 【补充】Linux-2.6.22.6 makefiles.txt翻译
- 用position: sticky 实现粘性元素区域悬浮效果
- Python API快餐教程(1)
- <<最小割模型在信息学竞赛中的应用>>的学习心得
- Handler的常见用法
- UPC 2017 Summer Training 1
- Ubuntu——触控板太灵敏
- 微信公众号授权登录(java实现)