HDU 6038 Function
来源:互联网 发布:我是大主宰服务端源码 编辑:程序博客网 时间:2024/06/05 12:46
Function
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 607 Accepted Submission(s): 243
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
从集合b中选择n个数构成f[i],问符合f[i] = b[ f[ a[i] ] ]的映射关系有多少种。
第一个样例 a={1,0,2} b={0,1}
那么f(0)=b[f(1)] f(1)=b[f(0)] f(2)=b[f(2)]
这里有两个环分别为 f(0)->f(1) 和f(2)
那么要使得满足条件带入的b必须成环而且是 a环长度的因子
按照这个思路就可以得到答案了~
很套路的题。
#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5+7;const long long mod = 1e9+7;int n,m;bool vis[MAXN];int a[MAXN],b[MAXN];vector<int>circle_a,factor[MAXN];//寻找环int dfs(int u,int *p){ if(vis[u])return 0; vis[u] = 1; return dfs(p[u],p) + 1;}//记录长度为下标的环的个数int lenb[MAXN];//得到因子void get_factor(){ for(int i = 1; i <= 100000; ++i) { for(int j = i; j <= 100000; j += i)factor[j].push_back(i); }}int main(){ get_factor(); int ca = 0; while(~scanf("%d%d",&n,&m)) { for(int i = 0; i < n; ++i)scanf("%d",&a[i]); for(int i = 0; i < m; ++i)scanf("%d",&b[i]); circle_a.clear(); memset(vis,0,sizeof vis); for(int i = 0; i < n; ++i) { if(vis[i])continue; circle_a.push_back(dfs(i,a)); } memset(vis,0,sizeof vis); memset(lenb,0,sizeof lenb); for(int i = 0; i < m; ++i) { if(vis[i])continue; lenb[dfs(i,b)]++;; } long long ans = 1; for(int i = 0,l = circle_a.size(); i < l; ++i) { int la = circle_a[i]; long long res = 0; for(int j = 0,l1 = factor[la].size(); j < l1; ++j) { int lb = factor[la][j]; res = (res + (long long)lb*lenb[lb])%mod; } ans = ans*res%mod; } printf("Case #%d: %I64d\n",++ca,ans); } return 0;}
阅读全文
1 0
- HDU 6038 Function
- HDU-6038 Function
- hdu 6038 Function(思维)
- HDU 6038 Function
- hdu 6038 Function
- HDU 6038 Function
- hdu 6038 Function
- HDU 6038 Function
- Function (HDU 6038)
- HDU 6038 Function【思维】
- hdu--6038--Function
- HDU 6038-Function
- hdu 6038 Function
- hdu 6038 Function
- Function HDU-6038
- HDU-6038 Function(思维)
- HDU 6038 Function (数学)
- HDU 6038 Function 置换群
- Apache Commons FileUpload
- Kettle7.1 学习笔记
- 牛客网模拟题-偶串
- centos6.8下安装mongodb-3.2.10
- poj 3264 Balanced Lineup 线段树
- HDU 6038 Function
- Python爬虫入门(5):URLError异常处理
- linux mysql创建用户赋权限
- word2vec
- C++ Vector STL find 查找
- layout优化减少textView创建
- java中的HashSet
- 初学cuda程序的一点记录
- hdu 4430 Yukari's Birthday