排列+函数映射——hdu6038好题
/*
引理:[0,n-1]的排列,i向a[i]连边,那么每个数必定在一个环中
所以数组a可以分割成一些环,数组b也可以分割成一些环
先讨论a的一个环
a[a1]=a2 a[a2]=a3 a[a3]=a4 a[a4]=a5 a[a5]=a6 a[a6]=a1 这个环长度为6 那么套到函数 f[i]=b[ f[a[i] ]中
f[a1]=b[f[a2]]
f[a2]=b[f[a3]]
f[a3]=b[f[a4]]
f[a4]=b[f[a5]]
f[a5]=b[f[a6]]
f[a6]=b[f[a1]] 可以把b[f[a[i]]] = f[i] 当成是b数组的下标i到b[i]的映射 ,只不过这里的下标i 是f[a[i]]], b[i] 是f[i]
(可以发现这个f函数有点像反函数的感觉) 那么显然因为b也有和a类似的循环节,我们要找到一个b的循环节来套到上述映射里,这个循环节长度必须是上面循环节的约数
因为a[i]=ai 的循环节是6,那么b关于f的映射必定要能整除6
如果不是约数,那么f[ai]可能会对应到不同的值,这就不满足映射条件了 求方案数,设a其中一个长度为len的环的组成方案有k种,那么计算k时b所有长为len约数的环都要算上贡献
最后的结果就是 mul(k),即所有k相乘
*/ #include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define mod 1000000007
#define ll long long
int a[maxn],b[maxn],n,m,cnt1[maxn],cnt2[maxn],vis[maxn];
ll tot[maxn]; ll Pow(ll a,ll b){
ll res=;
while(b){
if(b%)res=res*a%mod;
b>>=;a=a*a%mod;
}
return res;
} int main(){
int t=;
while(cin>>n>>m){
t++;
memset(cnt1,,sizeof cnt1);
memset(cnt2,,sizeof cnt2); for(int i=;i<n;i++)scanf("%d",&a[i]);
for(int i=;i<m;i++)scanf("%d",&b[i]); memset(vis,,sizeof vis);
for(int i=;i<n;i++)
if(!vis[i]){
int p=i,len=;
vis[i]=;
while(a[p]!=i)
p=a[p],len++,vis[p]=;
cnt1[len]++;
} memset(vis,,sizeof vis);
for(int i=;i<m;i++)
if(!vis[i]){
int p=i,len=;
while(b[p]!=i)
p=b[p],len++,vis[p]=;
cnt2[len]++;
} memset(tot,,sizeof tot);
for(int len=;len<=m;len++)//枚举b环的长度len
for(int j=;j*len<=n;j++)
tot[j*len]=(tot[j*len]+cnt2[len]*len%mod)%mod; //每个长度为len的a环都有tot[len]种安排方案
ll ans=;
for(int len=;len<=n;len++)
if(cnt1[len])
ans=ans*Pow(tot[len],cnt1[len])%mod; printf("Case #%d: %lld\n",t,ans);
}
return ;
}
排列+函数映射——hdu6038好题的更多相关文章
- C++ 函数映射使用讲解
想想我们在遇到多语句分支时是不是首先想到的是 switc case 和 if else if ... 这2种方式在编码方面确实简单少,但是当分支达到一定数量后,特别是分支内部有嵌套大段代码或者再嵌套分 ...
- 5_PHP数组_3_数组处理函数及其应用_7_数组排列函数
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组排列函数 1. sort() 函数 程序: <?php $array = array("img ...
- hdu6038 Function 函数映射
/** 题目:hdu6038 Function 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给定一个a排列[0,n-1],一个b排列[0, ...
- Python排列函数:sort、sorted
排序函数介绍:sort()和sorted()都属于Python list的排序方法 区别:sort()属于永久性排列,直接改变该list: sorted属于暂时性排列,会产生一个新的序列. #sort ...
- Exponial~(欧拉函数)~(发呆题)
Description Everybody loves big numbers (if you do not, you might want to stop reading at this point ...
- MS笔试中的一个关于函数返回的“小”题
Which of following C++ code is correct ? A. int f() { ); return *a; } B. int *f() { int a[3] = {1,2, ...
- map()函数映射
map()函数(映射) pattern = "abba" str = "dog cat cat dog" res=str.split() print(list( ...
- 百练8216-分段函数-2016正式A题
百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问 A:分段函数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序 ...
- hdu1521 排列组合 指数型母函数模板题
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- java多线程面试题选择题大全含答案
v java多线程面试题选择题大全含答案 java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {T ...
- HTTP/2的优先级
前言 记得HTTP/3即将标准化了.今日早读文章由@smallbonelu翻译授权分享. @smallbonelu,一枚爱好跑步的前端工程师 正文从这开始-- 以正确的顺序请求页面资源对于快速的用户体 ...
- Case Closed?
Finally, we'll want a way to test whether a file we've opened is closed. Sometimes we'll have a lot ...
- 深入理解Magento-第九章-修改、扩展、重写Magento代码
(博主提示:本章应该不是原作者的第九章,仅作补充和参考) 作为一个开发者的你,肯定要修改Magento代码去适应你的业务需求,但是在很多时候我们不希望修改Magento的核心代码,这里有很多原因,例如 ...
- 【dart学习】-- Dart之函数
1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数 ...
- 思维构造+匹配——cf1199E
直接枚举每条边,如果边加到图中后还是个匹配图,就直接加,反之就不加 这样加完所有边后,剩下的点必定可以组成一个独立集:因为如果剩下的点中还有互相匹配的,那么这对点应该在加边时就被算到匹配图中 所以要么 ...
- noip2015 提高组 day1t1 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- NX二次开发-NXOpen::Drawings::DrawingSheet Class Reference
NX11+VS2013 #include <NXOpen/Section.hxx> #include <NXOpen/SectionCollection.hxx> #inclu ...
- 简单理解Ext.extend
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nuxt.js 本地开发跨域问题(Access-Control-Allow-Origin)及其解决方案
先运行npm i @gauseen/nuxt-proxy -D 再nuxt.config.js的module.exports 里面添加如下代码 modules:[ '@nuxtjs/axios', / ...