HDU 6038 (2017 多校训练赛1 1006) Function(图论)
2017-07-25 20:32
381 查看
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 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 109+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.
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 2
1 0 2
0 1
3 4
2 0 1
0 2 3 1
Sample Output
Case #1: 4
Case #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 1000000007 vector<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); } }
相关文章推荐
- HDU-2017 多校训练赛1-1006-Function
- HDU-2017 多校训练赛9-1006-Senior Pan
- 2017 多校训练第一场 HDU 6038 Function
- HDU-2017 多校训练赛5-1006-Rikka with Graph
- HDU 6038 Function (2017多校1 -- 找循环节计数)
- HDU-2017 多校训练赛8-1006-Fleet of the Eternal Throne
- HDU-2017 多校训练赛2-1006-Funny Function
- hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
- HDU 2017 多校联合训练赛5 5008 6092 Rikka with sebset
- HDU 6038 - Function | 2017 Multi-University Training Contest 1
- HDU 6106 (2017 多校训练赛6 1011)Classes
- HDU-2017 多校训练赛6-1007-GCDispower
- HDU-2017 多校训练赛9-补题
- HDU-2017 多校训练赛3-1005-RXD and dividing
- 2017多校联合第一场 1006题 hdu 6038 Function 循环节
- HDU-2017 多校训练赛1-1003-Colorful Tree
- HDU 6166 2017多校 Team09 1006:Dijkstra顶点子集最短路径
- HDU-2017 多校训练赛3-补题
- HDU 6033 (2017 多校训练赛1 1001) Add More Zero