解法:这道题很有意思,值得一做和细细思考。

首先是我们要观察这个映射公式,他的实质是什么?其实就是b到a的循环映射,这是因为a数列和b数列都是0-n-1的排列,意味着每个数都是唯一的,那么ab的这个循环映射就是循环的封闭的不会影响到其他数。这样的话b到a的映射就形成了一个个的循环节。

那么我们考虑先分别把a数组和b数组的循环节找出来,此时我们要思考怎样才能满足这样的循环映射呢?

答案就是a的循环节大小要是b循环节大小的倍数!!!这个有点难解释,如果不是倍数关系的话会出现:b开始映射a,b的第一轮映射没事,当第一轮完了之后就会出现不匹配的问题,这是因为b不是a的因子。

那么答案就出来了,对于每某一个b的循环节lena只要它是某一个a的循环节lena的因子l就能对lena造成lenb的贡献(意思是开始映射的位置是不关键的,关键的是大小)。那么我们就用类似与埃氏筛素数的办法计算每一个lenb对其倍数的贡献,之后枚举lena累乘贡献即可。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
const int P=1e9+;
int n,m;
int a[N],b[N],c[N],na[N],nb[N]; bool vis[N];
void circle(int *a,int n,int *na) {
for (int i=;i<=n;i++) vis[i]=;
for (int i=;i<n;i++) {
if (vis[i]) continue;
vis[i]=;
int len=,now=i;
while (!vis[a[now]]) {
vis[a[now]]=;
now=a[now];
len++;
}
na[++na[]]=len;
}
} int main()
{
int cas=;
while (scanf("%d%d",&n,&m)==) {
for (int i=;i<n;i++) scanf("%d",&a[i]);
for (int j=;j<m;j++) scanf("%d",&b[j]);
na[]=nb[]=;
circle(a,n,na); circle(b,m,nb); for (int i=;i<=n;i++) c[i]=;
for (int i=;i<=nb[];i++)
for (int j=nb[i];j<=n;j+=nb[i]) c[j]+=nb[i]; long long ans=;
for (int i=;i<=na[];i++) ans=(ans*c[na[i]])%P;
printf("Case #%d: %lld\n",++cas,ans);
}
return ;
}

HDU-6038 Function 思维+循环节的更多相关文章

  1. hdu 4291 矩阵幂 循环节

    http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙: g(g(g(n))) mod 109  ...

  2. HDU 6038 - Function | 2017 Multi-University Training Contest 1

    /* HDU 6038 - Function [ 置换,构图 ] 题意: 给出两组排列 a[], b[] 问 满足 f(i) = b[f(a[i])] 的 f 的数目 分析: 假设 a[] = {2, ...

  3. HDU 6038 Function(思维+寻找循环节)

    http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给出两个序列,一个是0~n-1的排列a,另一个是0~m-1的排列b,现在求满足的f的个数. 思路: ...

  4. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  5. hdu 4794 FIb求循环节

    很容易看出来这道题是求模n意义下fib数列的最小循环节 对于fib数列的最小循环节的求法,我们可以这样: 1.令n=p1^m1 * p2^m2 * p3^m3…… 2.分别计算fib数列在模p1^m1 ...

  6. Cyclic Nacklace - HDU 3746(next求循环节)

    题目大意:给你一些串,问如果想让这个串里面的循环节至少循环两次,需要添加几个字符(只能在最前面或者最后面添加).比如ababc 需要添加5个就是添加ababc. 分析:其实字符串的长度len-next ...

  7. HDU 6740 kmp最小循环节

    题意:给一个无线循环小数的前几位,给n,m 选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b 使得n*a-m*b最大 样例: 2 1 12.1212 输出 6 选择2,2*1-1*1=1 ...

  8. hdu 1358 Period 最小循环节

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 分析:已知字符串,求其由最小循环节构成的前缀字符串. /*Period Time Limit: ...

  9. 2017ACM暑期多校联合训练 - Team 1 1006 HDU 6038 Function (排列组合)

    题目链接 Problem Description You are given a permutation a from 0 to n−1 and a permutation b from 0 to m ...

随机推荐

  1. Windows 搭建Hadoop 2.7.3开发环境

    1.安装配置Java环境 1.1.安装Windows版本的jkd应用程序 当前的系统环境是64位Windows 7,因此下载64位JDK,下载地址:http://download.oracle.com ...

  2. linux socket 缓存: core rmem_default rmem_max

    https://blog.csdn.net/penzchan/article/details/41682411

  3. pycharm中添加python3 的环境变量

    i卡是HDKJHA{{sadfsdafdsafd.jpg(uploading...)}}S{{53ad37a938001.jpg(uploading...)}}

  4. MyEclipse/Eclipse启动时workspace不提示,解决办法

    右键MyEclipse/Eclipse的快捷方式,选择属性(属性->快捷方式->目标),在目标的最后面加上" -clean",如:"D:\Myeclipse8 ...

  5. 字符串中的TRIM操作

    std::string& ltrim(std::string& str, const std::string& chars = "\t\n\v\f\r ") ...

  6. [SDOI2016]征途 —— 斜率优化DP

    时隔多年没有碰斜率优化了... 想当年被斜率优化虐的死去活来,现在看看...也就那样吧. Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计 ...

  7. tensorflow和pytorch的区别

    pytorch是动态框架,tensorflow是静态框架 针对tensorflow,我们先构造了一个计算图,构建完之后,这个计算图就不能改变了,我们再开启会话,输入数据,进行计算.那么这个流程就是固定 ...

  8. 谷歌,火狐浏览器不能禁用自动补齐的bug缺陷

    IE浏览器里有autocomplete="off",可以禁止自动补全账号和密码,为了防止信息泄露,需要去除自动补齐. 自动补齐产生的场景是,form里面有密码框,因此只要将该密码框 ...

  9. python基础-6 正则表达式

    一 python正则简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现. 正则表达式模式被编译成一系列的字 ...

  10. web 前端1 拾遗

    1.整体布局 三个div header body footer 2.div的居中 width:980px margin:0 auto 3.内联标签 inline #内联 无法使用高度.宽度 block ...