HDU 6038 (2017 多校训练赛1 1006) Function(图论)
来源:互联网 发布:java vr开发入门 编辑:程序博客网 时间:2024/05/19 06:19
2017 Multi-University Training Contest - Team 1 1006
Function
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
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 和b 满足 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环长度的因子
按照这个思路就可以得到答案了~
AC代码:
#include<stdio.h>#include<string.h>#include<vector>using namespace std;#define mod 1000000007vector<int>v;vector<int>G[100010];void init(){for(int i=1;i<=100000;i++){for(int j=i;j<=100000;j+=i)G[j].push_back(i);}}int a[100010],b[100010],vis[100010],blen[100010];int dfs(int pr,int *p){if(vis[pr])return 0;vis[pr]=1;return dfs(p[pr],p)+1;}int main(){int n,m,cas=0;init(); //预处理因子while(scanf("%d%d",&n,&m)==2){v.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])v.push_back(dfs(i,a)); //找a的环 和记录环的长度 }memset(blen,0,sizeof(blen));memset(vis,0,sizeof(vis));for(int i=0;i<m;i++){if(!vis[i])blen[dfs(i,b)]++; //找b 的环,和记录长度数量用于和a匹配 }long long ans=1;for(int i=0;i<v.size();i++){long long t=0;for(int j=0;j<G[v[i]].size();j++){t+=G[v[i]][j]*blen[G[v[i]][j]];t%=mod;}ans*=t;ans%=mod;}printf("Case #%d: %lld\n",++cas,ans);}}
阅读全文
1 0
- HDU 6038 (2017 多校训练赛1 1006) Function(图论)
- HDU-2017 多校训练赛1-1006-Function
- HDU-2017 多校训练赛2-1006-Funny Function
- 2017 多校训练第一场 HDU 6038 Function
- 2017 多校训练第二场 HDU 6050 Funny Function
- HDU-2017 多校训练赛9-1006-Senior Pan
- HDU-2017 多校训练赛1-1002-Balala Power!
- HDU-2017 多校训练赛1-补题
- HDU-2017 多校训练赛1-1003-Colorful Tree
- 2017多校训练Contest2: 1006 Funny Function hdu6050
- HDU-2017 多校训练赛1(赛上+补题)
- HDU 6043 (2017 多校训练赛1 1002) Balala Power!
- HDU 6043(2017 多校训练赛1 1011) KazaQ's Socks
- HDU 6033 (2017 多校训练赛1 1001) Add More Zero
- HDU-2017 多校训练赛2-1009-TrickGCD
- HDU-2017 多校训练赛2-1003-Maximum Sequence
- HDU-2017 多校训练赛2-1011-Regular polygon
- HDU-2017 多校训练赛2-补题
- Python作为PHP扩展
- [bzoj4373]算术天才⑨与等差数列
- GPS定位基本原理
- java复制数组的四种方法
- HDOJ_1004这个题做了好久
- HDU 6038 (2017 多校训练赛1 1006) Function(图论)
- gitlab如何删除一个项目
- Android 一天搞定 NDK和JNI编程 3分钟学会写NDK实例
- 关于残差网络Resnet的理解
- HDU 3068 2017 Multi-University Training Contest
- _CrtIsValidHeapPointer出错的解决方法
- FileReader图片预览上传
- java IO序列化—纯个人见解
- [bzoj4241]历史研究 回滚莫队