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

首先是我们要观察这个映射公式,他的实质是什么?其实就是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. winXP 系统下ubuntu-12.04 硬盘安装

    目地:实现XP ubuntu双系统,引导可选择. 出处:根查阅网络资料和自己的安装体检,记录如是. 系统版本:windowsXP  SP3   Ubuntu 12.04 工具资源:grup4dos 2 ...

  2. USACO2018 DEC (Gold) (dp,容斥+哈希,最短路)

    \(T1\) 传送门 解题思路 傻逼\(dp\)..直接\(ST\)表处理最大值\(O(n^2)\)艹过了. 代码 #include<bits/stdc++.h> using namesp ...

  3. springMVC解决跨域

    原文:https://www.cnblogs.com/shihaiming/p/9544060.html 介绍:   跨站 HTTP 请求(Cross-site HTTP request)是指发起请求 ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_6_LinkedHashSet集合

    把www挪到最上面,第一个加入到哈希

  5. 关于hadoop登陆kerberos时设置环境变量问题的思考

    中心思想,设置kerberos环境变量时,发现JDK源码当中的一个问题,故描述如下. 在平时的使用中,如果hadoop集群配置kerberos认证的话,使用java访问hdfs或者hive时,需要先进 ...

  6. vue中淡入淡出示例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. c# 动态加载tlb为程序集

    private enum RegKind { RegKind_Default = , RegKind_Register = , RegKind_None = } [DllImport("ol ...

  8. 分布式ID生成器 snowflake(雪花)算法

    在springboot的启动类中引入 @Bean public IdWorker idWorkker(){ return new IdWorker(1, 1); } 在代码中调用 @Autowired ...

  9. python3爬虫之urllib初探

    urllib主要包含request(请求模块).error(异常处理模块).parse(工具模块).robotparser(识别网站的robots.txt文件,是否允许爬取). request(请求模 ...

  10. 编码总结一:Java默认字符集

    (一)JVM默认字符集——Charset.defaultCharset() 获取Java虚拟机默认字符集,该字符集默认跟操作系统字符集一致,也可以通过-Dfile.encoding="GBK ...