HDU-6038 Function 思维+循环节

解法:这道题很有意思,值得一做和细细思考。
首先是我们要观察这个映射公式,他的实质是什么?其实就是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 思维+循环节的更多相关文章
- hdu 4291 矩阵幂 循环节
http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙: g(g(g(n))) mod 109 ...
- HDU 6038 - Function | 2017 Multi-University Training Contest 1
/* HDU 6038 - Function [ 置换,构图 ] 题意: 给出两组排列 a[], b[] 问 满足 f(i) = b[f(a[i])] 的 f 的数目 分析: 假设 a[] = {2, ...
- HDU 6038 Function(思维+寻找循环节)
http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给出两个序列,一个是0~n-1的排列a,另一个是0~m-1的排列b,现在求满足的f的个数. 思路: ...
- 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 ...
- hdu 4794 FIb求循环节
很容易看出来这道题是求模n意义下fib数列的最小循环节 对于fib数列的最小循环节的求法,我们可以这样: 1.令n=p1^m1 * p2^m2 * p3^m3…… 2.分别计算fib数列在模p1^m1 ...
- Cyclic Nacklace - HDU 3746(next求循环节)
题目大意:给你一些串,问如果想让这个串里面的循环节至少循环两次,需要添加几个字符(只能在最前面或者最后面添加).比如ababc 需要添加5个就是添加ababc. 分析:其实字符串的长度len-next ...
- HDU 6740 kmp最小循环节
题意:给一个无线循环小数的前几位,给n,m 选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b 使得n*a-m*b最大 样例: 2 1 12.1212 输出 6 选择2,2*1-1*1=1 ...
- hdu 1358 Period 最小循环节
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 分析:已知字符串,求其由最小循环节构成的前缀字符串. /*Period Time Limit: ...
- 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 ...
随机推荐
- BigDecimal.setScale 处理java小数点[转]
BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删除多余 ...
- 使用ajax异步下载文件,后端为struts2
前端采用伪表单: 然后调用 后台代码为 效果图:
- canvas介绍(画布)
canvas(画布)主要是位图 svg(矢量图) canvas标签,必须要写的3个属性 id width height 为什么不再style中设置width和height呢? 因为这设置width和h ...
- 三十五、robotframework中怎么将100转化成100.00
1.将100转化成100.00
- firefox的group群组功能很好!
================================ /usr/share/themes中有一些主题,包括: adwaita: 阿德维塔, 不二论 anaconda等等. 计算机环境: f ...
- log4j.rootLogger作用域
log4j.rootLogger只对没有申明appender的包起作用:
- 测开之路一百一十:bootstrap图片
bootstrap图片 引入bootstrap 原版的图片 bootstrap处理后的: 圆角.圆形.缩略图 自适应窗口
- c# Thread5——线程同步之基本原子操作。Mutex互斥量的使用
之前的博文也说到了如果多线程对于访问的公共资源操作都是原子操作,那么可以避免竞争条件.关于多线程的竞争可以百度. 1.执行最基本的原子操作 c#提供了一系列供我们使用的原子操作的方法和类型,比如我们的 ...
- C# Thread2——线程优先级
C#中Thread的优先级不是决定每个线程被执行顺序.它决定了线程可以占用CPU的时间 Thread的优先级设置是自带的枚举类型"ThreadPriority" [ComVisib ...
- 转 linux查看文件前几行和后几行的命令
可以使用head(查看前几行).tail(查看末尾几行)两个命令.例如:查看/etc/profile的前10行内容,应该是:# head -n 10 /etc/profile查看/etc/profil ...