/**
题目:hdu6038 Function
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038
题意:给定一个a排列[0,n-1],一个b排列[0,m-1]。 定义函数f,定义域为[0,n-1],值域为[0,m-1] 请计算有多少种函数,满足f(i) = bf(ai) 对于每一个i,0<=i<=n-1; f(ai)是b排列的下标。ai表示a排列下标为i的值 两个不同的函数区分是,至少有一个i,f(i)不同于原来的f(i)'; 每一个f(i)都有一个唯一的值,表示这是一个函数。 输出结果%1e9+7; 思路: 直接拿第二组样例进行说明:
3 4
2 0 1
0 2 3 1 a0 = 2, a1 = 0, a2 = 1; b0 = 0, b1 = 2, b2 = 3, b3 = 1; f(0) = bf(2), f(2) = bf(1), f(1) = bf(0) ; 因为f(i)的值域为[0,m-1], 假设:f(2) = 0, 那么f(0) = bf(2) = b0 = 0; f(1) = bf(0) = b0 = 0;
f(2) = bf(1) = b0 = 0; 最终推回来发现f(2)=0,和假设相同,所以成立。 可以发现f(2)确定值之后,f(0),f(1)也随之确定,如果成立。 假设:f(2) = 2, 同理推得, f(0) = 3, f(1) = 1, f(2) = 2.最终推回来,发现f(2)=2.和原来的假设相同。所以成立。
f(2) = 3.... 成立
f(2) = 1.... 成立。 对a排列可以建环, 0->2->1->0;
对b排列可以建环,0->0, 1->2->3->1;
由于a环0->2->1->0是0->0的整数倍,所以产生贡献1,即f(0)=f(1)=f(2)=0;
由于a环0->2->1->0是1->2->3->1的整数倍,所以产生贡献3,只要确定f(0) = 1或者2或者3,
那么f(1),f(2)也随着确定,所以三种。 最终ans = 1+3 = 4; 由于a是一个[0,n-1]排列,所以所有的数通过下标指向关系进行建图,由于每个下标只有一个唯一的值ai,该值不可能和aj相同,所以所有的图都是环。
同理b也是环。那么两边的环枚举进行长度比较,如果a中的环是b中的环的长度的整数倍,那么b中该环可以给a中该环作出贡献,贡献为b环长度。
如果b中有多个环可以给a中某个环有贡献,则累加。最终a中所有的环的贡献相乘便是答案。 */ #include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<assert.h>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int mod = 1e9+;
const int N = 1e5 + ;
int visa[N]; ///visa[i]表示a中长度为i的环出现的次数。
int visb[N]; ///visb[i]表示b中长度为i的环出现的次数。
vector<P>va, vb;///从visa,visb中取出来。
int vis[N];
int pa[N], pb[N];
LL value[N];
LL Pow(LL a,LL b)
{
LL p = ;
while(b)
{
if(b&) p = p*a%mod;
a = a*a%mod;
b>>=;
}
return p;
}
int main()
{
int n, m, cas=;
while(scanf("%d%d",&n,&m)==)
{
for(int i = ; i < n; i++) scanf("%d",&pa[i]);
for(int i = ; i < m; i++) scanf("%d",&pb[i]);
memset(visa, , sizeof visa);
memset(vis, , sizeof vis);
for(int i = ; i < n; i++){
if(vis[i]==){
int pos = i;
int cnt = ;
vis[i] = ;
while(vis[pa[pos]]==){
pos = pa[pos];
vis[pos] = ;
cnt++;
}
visa[cnt]++;
}
}
memset(visb, , sizeof visb);
memset(vis, , sizeof vis);
for(int i = ; i < m; i++){
if(vis[i]==){
int pos = i;
int cnt = ;
vis[i] = ;
while(vis[pb[pos]]==){
pos = pb[pos];
vis[pos] = ;
cnt++;
}
visb[cnt]++;
}
}
va.clear();
vb.clear();
for(int i = ; i <= n; i++){
if(visa[i]==) continue;
va.push_back(P(i,visa[i]));
}
for(int i = ; i <= m; i++){
if(visb[i]==) continue;
vb.push_back(P(i,visb[i]));
}
for(int i = ; i < va.size(); i++){
value[i] = ;
for(int j = ; j < vb.size(); j++){
if(va[i].first%vb[j].first==){
value[i] += vb[j].first*vb[j].second;
}
}
}
LL ans = ;
for(int i = ; i < va.size(); i++){
if(value[i]==){
ans = ; break;
}
ans = ans*Pow((LL)value[i],(LL)va[i].second)%mod;
}
printf("Case #%d: %lld\n",cas++,ans);
}
return ;
}

hdu6038 Function 函数映射的更多相关文章

  1. 关于Function()函数对象的那些小九九

    概念:首先,函数是一种特殊类型的数据,函数也是数据类型的一种,实际上函数也是一种对象,函数对象的内建构造器是Function(); 函数的几种创建方式: 函数声明法: function sum(a,b ...

  2. JavaScript function函数种类(转)

    转自:http://www.cnblogs.com/polk6/p/3284839.html JavaScript function函数种类 本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通 ...

  3. C++ 函数映射使用讲解

    想想我们在遇到多语句分支时是不是首先想到的是 switc case 和 if else if ... 这2种方式在编码方面确实简单少,但是当分支达到一定数量后,特别是分支内部有嵌套大段代码或者再嵌套分 ...

  4. JavaScript function函数种类介绍

    JavaScript function函数种类介绍 本篇主要介绍普通函数.匿名函数.闭包函数 1.普通函数介绍 1.1 示例 ? 1 2 3 function ShowName(name) {     ...

  5. 【JS学习笔记】关于function函数

    函数的基本格式 function 函数名() { 代码: } 函数的定义和调用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  6. 2019-2-14SQLserver中function函数和存储过程、触发器、CURSOR

    Sqlserver 自定义函数 Function使用介绍 前言:         在SQL server中不仅可以可以使用系统自带的函数(时间函数.聚合函数.字符串函数等等),还可以根据需要自定义函数 ...

  7. 创建一个Scalar-valued Function函数来实现LastIndexOf

    昨天有帮助网友解决的个字符串截取的问题,<截取字符串中最后一个中文词语(MS SQL)>http://www.cnblogs.com/insus/p/7883606.html 虽然实现了, ...

  8. javascript:function 函数声明和函数表达式 详解

    函数声明(缩写为FD)是这样一种函数: 有一个特定的名称 在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中 在进入上下文阶段创建 影响 ...

  9. jquery中的 $(function(){ .. }) 函数

    2017-04-29 在讲解jquery中的 $(function(){ .. }) 函数之前,我们先简单了解下匿名函数.匿名函数的形式为:(function(){ ... }),又如 functio ...

随机推荐

  1. Node.js umei图片批量下载Node.js爬虫1.00

    这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...

  2. 【甘道夫】Win7环境下Eclipse连接Hadoop2.2.0

    准备: 确保hadoop2.2.0集群正常执行 1.eclipse中建立javaproject,导入hadoop2.2.0相关jar包 2.在src根文件夹下拷入log4j.properties,通过 ...

  3. PortableApps的使用方法

    1 从官方网站下载这个软件,建议只下载PortableApps Platform Only即可,因为官方提供的软件其实很少,大多数需要我们自己添加. PortableApps 致力于将一些常见的开源软 ...

  4. 自开发实现Quartz Web管理

    网上能找到的QuartzWeb管理的资料都是使用的一个国外人写的Quartz WebApp的东东.功能也非常全面. 可是作为自己的应用其有用不了那么多功能,一般我们仅仅要能够定义一个job,指定一个C ...

  5. sublime HtmlPrettify

    用sublime都快一年多了,终于找到一款称心如意的format工具,可以同时格式化 html css js. HTML-CSS-JS Prettify 如果安装的时候出现问题,多调试调试,改改参数

  6. Android 如何添加一个新的时区

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  7. android 实现调查问卷-单选-多选

    非常久没写东西了.今天来总结下有关android调查问卷的需求实现. 转载请加地址:http://blog.csdn.net/jing110fei/article/details/46618229 先 ...

  8. js实现页面元素随着内容的滚动而滚动

      CreateTime--2017年9月4日16:55:06 Author:Marydon js实现页面元素随着内容的滚动而滚动 分析: CSS样式,使用绝对定位确定好页面元素在屏幕的位置(如:正中 ...

  9. Cacti监控MySQL实现过程中碰到的问题解汇总

    前言:cacti监控mysql服务器的大概50张graphs都弄出来了,也出图了,当中遇到一些问题,印象比較深刻的记录例如以下: (一):加入io监控 点击Create Graphs for this ...

  10. Linux-进程、进程组、作业、会话、控制终端详解

    一.进程 传统上,Unix操作系统下运行的应用程序. 服务器以及其他程序都被称为进程,而Linux也继承了来自unix进程的概念.必须要理解下,程序是指的存储在存储设备上(如磁盘)包含了可执行机器指 ...