【Link】:http://codeforces.com/contest/834/problem/C

【Description】



给你两个排列a和b;

a排列的长度为n,b排列的长度为m;

a∈[0..n-1],b∈[0..m-1];

然后让你求一个函数f[i];

f[i]的定义域为0..n-1,值域为0..m-1

同时使得对于任意f[i],i∈[0..n-1];

f(i)=bf(a[i])成立;

【Solution】



原始可以递推一下;

f(i)=bf(ai)=bbf(aai)

则可以一直写下去f[i]=bbbbbf(aaaaa[i]);

注意到a是一个排列;

最后肯定能形成一个环,则aaaaa..a[i]肯定又能变回i



f(i)=b⋯bf(i)l times b

(这里L是第一次回到i的L);

这里的含义其实就相当于f[i]是一个x

要使得

x=b....bx

而b也是一个排列;

也肯定有循环节;

这里从x开始的b数组的循环节长度一定得是上面的a的循环节的长度L的因子;

不然就不能在L次b之后回到x了;

于是,

a数组里找循环节的长度,在b数组中也找循环节的长度;

看看有多少个长度在a中有,且b数组中,有它的因子长度的循环节;

直接累加因子循环节长度到temp中;

然后累乘所有temp即可;

根据上面的形式,每个a循环节中的某一个位置,f只要确定了,其他该循环节中的f值也就确定了,然后那个位置有temp种选择;就是因子循环节中任意一个b[i]都可以;

找因子的时候,需要做些优化;

不然可能退成O(n2)的复杂度;

先枚举a数组有哪些循环节,长度为i;

然后用O(i12)复杂度枚举它可能的因子,(j是则n/j也是)

看看在b中有没有这样长度的;



【NumberOf WA】



0



【Reviw】



求因子的思想很好.



【Code】

#include <bits/stdc++.h>
using namespace std;
#define int long long const int N = 1e5;
const int MOD = 1e9+7; int n,m;
int a[N+10],b[N+10],cnta[N+10],cntb[N+10];
bool flag[N+10]; main(){
int kk = 0;
while (~scanf("%lld%lld",&n,&m)){
for (int i = 1;i <= n;i++){
scanf("%lld",&a[i]);
a[i]++;
}
for (int i = 1;i <= m;i++){
scanf("%lld",&b[i]);
b[i]++;
} memset(cnta,0,sizeof cnta);
memset(cntb,0,sizeof cntb); memset(flag,0,sizeof flag);
for (int i = 1;i <= m;i++)
if (!flag[i]){
int x = i,num = 0;
while (!flag[x]){
flag[x] = 1;
num++;
x = b[x];
}
cntb[num]++;
}
memset(flag,0,sizeof flag);
for (int i = 1;i <= n;i++)
if (!flag[i]){
int x = i,num = 0;
while (!flag[x]){
flag[x] = 1;
num++;
x = a[x];
}
cnta[num]++;
} int ans = 1;
for (int i = 1;i <= n;i++)
if (cnta[i]>0){
int temp = 0;
for (int j = 1;j*j <= i;j++)
if (i%j==0){
temp = (temp + j*cntb[j])%MOD;
if (j != i/j)
temp = (temp + (i/j)*cntb[i/j])%MOD;
}
while (cnta[i]--){
ans = (ans*temp)%MOD;
}
}
printf("Case #%lld: %lld\n",++kk,ans);
}
return 0;
}

【hdu 6038】Function的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. 如何使 nginx 支撑更高并发

    /** * * * * 如何使 nginx 支撑更高的并发? * 原理: * 服务器方面可以从两个方面阐述: * 1.socket 链接方面:因为每次请求都是一次连接,而 nginx 服务器配置方面默 ...

  2. dd---复制文件并对原文件的内容进行转换和格式化处理

    dd命令用于复制文件并对原文件的内容进行转换和格式化处理.dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果.用的比较多的还是用dd来备份裸设备.但是不推荐,如果需要 ...

  3. [BJOI2018]求和(树链剖分)

    题目描述 master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的 kkk 次方和,而且每次的 kkk 可能是不同的.此处节点深度的定义是这个节点到根 ...

  4. HBase 1.1.2 优化插入 Region预分配

    预分Region 与 不预分Region 的测试: 1 不预分Region:       23~29秒插入100W数据   并且蛋疼的是每次都写入一个 RegionServer 且  只在一个 Reg ...

  5. [Python] Normalize the data with Pandas

    import os import pandas as pd import matplotlib.pyplot as plt def test_run(): start_date='2017-01-01 ...

  6. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  7. Servlet具体解释

    Servlet具体解释 基本概述 Session在计算机中,尤其是在网络应用中,称为"会话控制".在计算机专业术语中.Session是指一个终端用户与交互系统进行通信的时间间隔,通 ...

  8. JSP编程技术5-购物车的实现-session会话对象

    首先十分感谢大家对我的文章的支持,我是个刚刚才找到自己方向的在校大学生,当然我的知识和能力有限,眼下正在努力恶补学习中.当我看到自己首次发表到CSDN首页的文章才几个小时阅读量就超过了100时,对我来 ...

  9. LVDS原理及设计指南

    LVDS是一种低摆幅的差分信号技术,它使得信号能在差分PCB 线对或平衡电缆上以 几百Mbps的速率传输,其低压幅和低电流驱动输出实现了低噪声和低功耗.       IEEE 在两个标准中对LVDS ...

  10. js如何生成[n,m]的随机数(整理总结)

    js如何生成[n,m]的随机数(整理总结) 一.总结 一句话总结: // max - 期望的最大值 // min - 期望的最小值 parseInt(Math.random()*(max-min+1) ...