题目链接

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是[0n-1]的排列,数组b是[0m-1]的排列。现在定义f(i)=b[f(a[i])];

  • 问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中环的长度的约数。

为什么必须的是约数呢?

因为如果b的环的长度是a的环的长度的约数的话,那也就意味着用b这个环也能构成a这个环,只不过是多循环了几次而已。

然后找到a中所有环的方案数,累乘便是答案。

为什么要累乘呢?我最开始一直以为要累加。

这个就用到了排列组合的思想,因为肯定要f(i)肯定要满足所有的数,而a中的每个环都相当于从a中取出几个数的方案数,所以总共的方案数应该累乘。

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
const int max_n=100010;
const int mod=1e9+7;
int n,m;
int a[max_n],b[max_n],len_b[max_n];
bool vis[max_n];
vector <int>A,fac[max_n]; ///构建环,并返回环的大小
int dfs(int N,int *c)
{
if(vis[N])
return 0;
vis[N]=1;
return dfs(c[N],c)+1;
} void get_fac()
{
for(int i=1; i<=100000; i++)///fac[j]里面保存的是长度为j的环的因子
{
for(int j=i; j<=100000; j+=i)
fac[j].push_back(i);
}
} int main()
{
int Case=0;
get_fac();
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]);
A.clear();
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
if(vis[i]) continue;
A.push_back(dfs(i,a));///a数组中环的长度,重复的长度也是保存的
}
memset(vis,0,sizeof(vis));
memset(len_b,0,sizeof(len_b));
for(int i=0; i<m; i++)
{
if(vis[i]) continue;
len_b[dfs(i,b)]++;///b数组中长度为dfs(i,b)的环的个数
}
long long int ans=1;
for(int i=0,L=A.size(); i<L; i++)
{
int la=A[i];///取出a中的一个长度为la的环
long long res=0;
for(int j=0,ll=fac[la].size(); j<ll; j++)
{
int lb=fac[la][j];///lb是长度为la的环的一个因子
res=(res+(long long )lb*len_b[lb])%mod;///因子个数乘以环的个数就是一功德方案数
}
ans=ans*res%mod;
}
printf("Case #%d: %lld\n",++Case,ans); }
}

2017ACM暑期多校联合训练 - Team 1 1006 HDU 6038 Function (排列组合)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  2. 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  3. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  4. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  5. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  6. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  7. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  8. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  9. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

随机推荐

  1. HTTP协议 结构,get post 区别(阿里面试)

    如果需要想了解相关的TCP的协议结构,底层架构,以及每次面试必问的三次握手,四次挥手可以 参考:TCP协议详解7层和4层解析(美团面试,阿里面试) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌 ...

  2. POJ3378_Crazy Thairs

    这个题目很有意思,也是一个很好的题目,涉及的知识点比较广,要求较高. 题目是这样的,给定你一个n个数的数列,问你有多少个长度为5的上升序列. 首先看到有50000,我们就知道肯定不会是DP.(但是不知 ...

  3. collection 在创建迭代器后 不能在添加数据 否则会出现并发问题

    collection 在创建迭代器后 不能在添加数据 否则会出现并发问题

  4. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  5. 【Java】SVN下载maven项目到eclipse之后,项目红叉,pom.xml出现Missing artifact fakepath:dubbo:jar:2.8.5等缺少jar包情况

    刚入公司,从svn上把代码弄下来之后导入eclipse,一般是maven项目,往往项目都会有红叉.如果排除代码本身问题,一般是jar包没有. 鼠标点开pom.xml文件,在约束那里一般有红叉,鼠标放上 ...

  6. 原子性、内存可见性和重排序——重新认识synchronized和volatile

    一.原子性 原子性操作指相应的操作是单一不可分割的操作.例如,对int变量count执行count++d操作就不是原子性操作.因为count++实际上可以分解为3个操作:(1)读取变量count的当前 ...

  7. 【题解】JSOI2011分特产

    没sa可suo的,sui题一道…… #include <bits/stdc++.h> using namespace std; #define maxn 3000 #define mod ...

  8. 【刷题】BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster

    Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...

  9. (转)搭建本地 8.8 W 乌云漏洞库

    下载地址: 开源地址: https://github.com/m0l1ce/wooyunallbugs 百度网盘: 链接: http://pan.baidu.com/s/1nvkFKox 密码: 94 ...

  10. HashCode与Equals回顾

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...