hdu6038
hdu6038
分析
求函数 \(f\) 的构成方案,\(f\) 确定下来后,\(f\) 和 \(b\) 的值也是一一对应的了( \(f(i)=b_{f(a_i)}\) ),观察 \(a\) 数组,代入 \(f\) 函数,存在循环节,比如 \(a[0] = 1, a[1] = 0\),那么循环节长度为 2,代入后,\(f(0)=b_{f(1)}, f(1)=b_{f(0)}\),也能形成类似的循环节,正好是前面循环节的长度(后面我们直接去考虑对应 \(a\) 数组的循环节就好了)。观察 \(b\) 数组,同样会存在一些循环节,如果 \(b\) 数组中有一个长度为 \(1\) 的和一个长度为 \(2\) 的循环节, \(a\) 数组中有一个长度为 \(2\) 的循环节,那么显然给 \(a\) 数组这个长度为 \(2\) 的循环节分别提供一种和两种方案(因为是循环,可以看做是一个环,那么可以调整所有数的位置,保持每个数的相对位置不变,所以长度 \(2\) 的能提供两种)。所有在 \(b\) 数组的循环节且长度是 \(a\) 中的某个循环节长度的因子,都能增加 \(a\) 中这个循环节的方案数,最后将 \(a\) 中所有循环节的方案数相乘即可。(把样例画画找下规律......)
code
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
typedef long long ll;
const ll MAXN = 1e5 + 10;
const ll INF = 1e8;
const ll MOD = 1e9 + 7;
using namespace std;
int kase = 1;
int a[MAXN], b[MAXN];
int vis[MAXN];
int loop_b[MAXN];
int loop_a[MAXN];
int main() {
int n, m;
while(~scanf("%d%d", &n, &m)) {
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for(int i = 0; i < m; i++) {
scanf("%d", &b[i]);
}
memset(vis, 0, sizeof vis);
memset(loop_b, 0, sizeof loop_b);
memset(loop_a, 0, sizeof loop_a);
for(int i = 0; i < m; i++) {
if(!vis[i]) {
int x = b[i];
int cnt = 0;
while(!vis[x]) {
cnt++;
vis[x] = 1;
x = b[x];
}
loop_b[cnt]++;
}
}
memset(vis, 0, sizeof vis);
for(int i = 0; i < n; i++) {
if(!vis[i]) {
int x = a[i];
int cnt = 0;
while(!vis[x]) {
cnt++;
vis[x] = 1;
x = a[x];
}
loop_a[cnt]++;
}
}
ll ans = 1;
for(int i = 1; i <= n; i++) {
ll res = 0;
for(int j = 1; j * j <= i; j++) { // 这里可以预处理一波
if(i % j == 0) {
int k = j;
res += loop_b[j] * j;
if(j * j != i) {
k = i / j;
res += loop_b[k] * k;
}
}
}
int C = loop_a[i];
while(C--) {
ans = (ans * res) % MOD;
}
}
printf("Case #%d: %lld\n", kase++, ans);
}
return 0;
}
hdu6038的更多相关文章
- hdu6038 Function 函数映射
/** 题目:hdu6038 Function 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意:给定一个a排列[0,n-1],一个b排列[0, ...
- hdu6038[找规律+循环节] 2017多校1
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...
- 2017多校第一套&&hdu6038 思维 数学
链接 http://acm.hdu.edu.cn/showproblem.php?pid=6038 题意: 给你一个a序列,代表0到n-1的排列:一个b序列代表0到m-1的排列.问你可以找出多少种函 ...
- 【置换群】【枚举约数】hdu6038 Function
把b数组的所有置换群求出来,用数组记录一下每个大小所出现的次数. 然后求a的置换群,对每个置换群求能被其整除的b的置换群的大小总和(只有这些才能满足构造出一个f,且不自相矛盾),然后把它们全都乘起来就 ...
- HDU6038:Function(循环群/节+找公式)
传送门 题意 给出一个\(0\sim n-1\)的排列a,一个\(0\sim {m-1}\)的排列b,询问满足\[f(i)=b_{f(a_i)}~~(0\le i\le n-1)\]的函数的个数 分析 ...
- HDU-6038 Function 思维+循环节
解法:这道题很有意思,值得一做和细细思考. 首先是我们要观察这个映射公式,他的实质是什么?其实就是b到a的循环映射,这是因为a数列和b数列都是0-n-1的排列,意味着每个数都是唯一的,那么ab的这个循 ...
- 排列+函数映射——hdu6038好题
/* 引理:[0,n-1]的排列,i向a[i]连边,那么每个数必定在一个环中 所以数组a可以分割成一些环,数组b也可以分割成一些环 先讨论a的一个环 a[a1]=a2 a[a2]=a3 a[a3]=a ...
- 「2017 Multi-University Training Contest 1」2017多校训练1
1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #inc ...
随机推荐
- 嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(上)
随着课内的学习,我想把每节课所学记录下来,以作查阅.以饲读者.由于我所上的是英文班课程,因此我将把关键术语的英文给出,甚至有些内容直接使用英文. 本次所介绍内容是关于Cortex-M3的基础内容. - ...
- js学习日记-各种宽高总结(配图)
1.窗口和浏览器 window.innerWidth.window.innerHeight 浏览器内部可用宽高 window.outerWidth.window.outerHeight 浏览器 ...
- Linux - Shell - 常用方法 - 备忘录
$? 上一个指令的返回值 =成功,=失败 dmesg 检测系统开机启动信息 $() 对命令的替换,同`` ${} 对变量的替换,同$var $(()) 对内部内容进行整数运算 i= grep AAA ...
- win10 64位 C# 连接oracle 32位, 遇到的问题及解决
首次 本机电脑是win10系统 64位的:安装的oracle数据库也是64位的: 服务器端的oracle 是32位的: 第一次安装的pl/sql 也是64位的, 配置完 F:\app\ln_qi\p ...
- [0] OpenCV_Notes - 琐碎
CV_8UC1,CV_8UC2,CV_8UC3等意思 一般的图像文件格式使用的是 Unsigned 8bits,CvMat矩阵对应的参数类型就是CV_8UC1,CV_8UC2,CV_8UC3.最后的C ...
- 斯坦福大学CS231n简要笔记和课后作业
笔记目录: 1. CS231n--图像分类(KNN实现) 2. 待更新... 3. 4.
- JSP/Servlet Web 学习笔记 DayThree —— 实现一个登陆小界面
项目说明 利用JSP.HTML.JS实现了一个简易的登陆系统.根据前两天的所学,实现了如下功能: a)用户名.密码验证(不基于数据库,只做一个简单的表单数据获取并验证) b)页面访问次数统计 c)验证 ...
- 详解Linux运维工程师应具备的十大技能
Linux系统如果是学习可以选用Redhat或CentOS,特别是CentOS在企业中用得最多,当然还会有其它版本的,但学习者还是以这2个版本学习就行,因为这两个版本都是兄弟,没区别的,有空可以再研究 ...
- 【bzoj2044】三维导弹拦截 dp+二分图最大匹配
题目描述 n个物品,第i个位置有ai.bi.ci三种属性.每次可以选出满足$\ a_{p_i}<a_{p_{i+1}}\ ,\ b_{p_i}<b_{p_{i+1}}\ ,\ c_{p_i ...
- Android程序猿必须警示的13个坑
Android开发中,犯错是难免的,不犯错是不正常的,但是犯了错以后,我们必须时刻谨记这些坑,避免再次被坑,下面小编整理了13个,日常工作中,比较常见且易犯的错误,分享给大家. 1.类的 ...