【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】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int N = 1e5;
  5. const int MOD = 1e9+7;
  6. int n,m;
  7. int a[N+10],b[N+10],cnta[N+10],cntb[N+10];
  8. bool flag[N+10];
  9. main(){
  10. int kk = 0;
  11. while (~scanf("%lld%lld",&n,&m)){
  12. for (int i = 1;i <= n;i++){
  13. scanf("%lld",&a[i]);
  14. a[i]++;
  15. }
  16. for (int i = 1;i <= m;i++){
  17. scanf("%lld",&b[i]);
  18. b[i]++;
  19. }
  20. memset(cnta,0,sizeof cnta);
  21. memset(cntb,0,sizeof cntb);
  22. memset(flag,0,sizeof flag);
  23. for (int i = 1;i <= m;i++)
  24. if (!flag[i]){
  25. int x = i,num = 0;
  26. while (!flag[x]){
  27. flag[x] = 1;
  28. num++;
  29. x = b[x];
  30. }
  31. cntb[num]++;
  32. }
  33. memset(flag,0,sizeof flag);
  34. for (int i = 1;i <= n;i++)
  35. if (!flag[i]){
  36. int x = i,num = 0;
  37. while (!flag[x]){
  38. flag[x] = 1;
  39. num++;
  40. x = a[x];
  41. }
  42. cnta[num]++;
  43. }
  44. int ans = 1;
  45. for (int i = 1;i <= n;i++)
  46. if (cnta[i]>0){
  47. int temp = 0;
  48. for (int j = 1;j*j <= i;j++)
  49. if (i%j==0){
  50. temp = (temp + j*cntb[j])%MOD;
  51. if (j != i/j)
  52. temp = (temp + (i/j)*cntb[i/j])%MOD;
  53. }
  54. while (cnta[i]--){
  55. ans = (ans*temp)%MOD;
  56. }
  57. }
  58. printf("Case #%lld: %lld\n",++kk,ans);
  59. }
  60. return 0;
  61. }

【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. iOS开发—— UIImage数据的保存

    1.保存图片和方向 [userDefault setObject:UIImagePNGRepresentation(image) forKey:udUserImage]; [userDefault s ...

  2. 入门python:《Python编程从入门到实践》中文PDF+英文PDF+代码学习

    入门python推荐学习久负盛名的python入门书籍<Python编程从入门到实践>. 书中涵盖的内容是比较精简的,没有艰深晦涩的概念,最重要的是每个小结都附带有"动手试一试& ...

  3. Python中的list,tuple,dict和set

    List list的创建与检索 Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 构造list非常简单,直接用 [ ] 把list的所有元素都括 ...

  4. Android Studio的Signature Versions选择,分别是什么意思

    转自原文 Android Studio的Signature Versions选择,分别是什么意思 打包一个文件的签名版本, 选V1打包出来的app是jar的(一般这种就是当做第三方导入项目来用的), ...

  5. 第6章8节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-小结

    本章我们重点环绕处理网络过来的命令的MonkeySourceNetwork这个事件源来阐述学习Monkey是怎样处理MonkeyRunner过来的命令的.以下总结下MonkeyRunner从启动Mon ...

  6. js实现复选框的操作-------Day41

    不知道之前的一篇为什么一直处于审核阶段.难道有哪个词语是敏感词被河蟹了? 无论了,又一次写了这篇,也算是加深记忆吧. 首先要写的是今天在进行表格数据操作时用到的对复选框checkbox的全选和全不选, ...

  7. 正则表达式 Tricks

    *:0 或 多个 ?:任意一个 [list]:a[xyz]b,a 与 b 之间必须也只能有一个字符,但只能是 x/y/z,也即:axb, ayb, azb [!list]:匹配除 list 中的任意单 ...

  8. 21. 【intellij idea】Project Structure 讲解

    转自:.https://www.cnblogs.com/zadomn0920/p/6196962.html 项目的左侧面板 项目设置->Project Project Settings -> ...

  9. Google Nexus 5x Android 7.0 Root

    很久没有写东西了,准备重新养成这个好习惯.因为自己一直在用Nexus,前段时间自己的Nexus5老的不行了,所以买了台5x,一直没时间root,今天有时间终于有时间弄一下. 在这里整理分享一下. 开始 ...

  10. org.w3c.dom.Document 与org.dom4j.Document互转

    public static Document parse(org.w3c.dom.Document doc) throws Exception { if (doc == null) { return ...