题目大意如下:给定一个序列,每个序列有值xi,现给定t个数列,对于每个长n的数列,求一段[l,r]使 [r-l+1]*gcd(l,r)最大,gcd(l,r)指的是该连续区间的最大公约数。

不难想到n^3,n^2logx,n^2的暴力吧

n^3DP,n^2logx暴力枚举,n^2DP

可以这样考虑,每次我对于某一个数,保存若干个值,以i为右端点的区间且gcd为某一值的时候这个区间最大的左端点位置是哪里?

但是你也许会认为这样做状态会不会有点多?更新是不是n方的呢?

其实不是的,因为我们可以从左到右来递推。

什么意思呢?对于每一个数,它与前面构成的gcd一定不会太多(约数肯定不会太多),所以我们最多也只需要保存每一个约数为gcd的时候左边最远能够拓展的位置。

其实远远不要保存每一个约数的位置,因为实际上很多的约数都不是gcd,这样我们就可以由左边的所有状态和右边的一个gcd一次来递推了。

当然,我们也可以直接利用指针的自动排序特性(类似链式前向星),我们碰到一个比当前(r-l+1)*val要小的就更新,因为我们再也尝试不到比它大的了。

  1. {$inline on}
  2.  
  3. const maxn=;
  4.  
  5. type edge=^node;
  6. node=record
  7. next,last:edge;
  8. pos,val:int64;
  9. end;
  10.  
  11. var head,tail:edge;
  12. e:array [..maxn] of edge;
  13. n,cnt:longint;
  14. ans:int64;
  15. f:array [..maxn] of int64;
  16.  
  17. procedure addedge(pos,value:int64); inline;
  18. var p:edge;
  19. begin
  20. inc(cnt);
  21. new(p);
  22. p^.next:=head^.next;
  23. p^.last:=head;
  24. p^.next^.last:=p;
  25. p^.last^.next:=p;
  26. p^.pos:=pos;
  27. p^.val:=value;
  28. e[cnt]:=p;
  29. end;
  30.  
  31. procedure delete(var p:edge); inline;
  32. begin
  33. p^.last^.next:=p^.next;
  34. p^.next^.last:=p^.last;
  35. end;
  36.  
  37. procedure init; inline;
  38. begin
  39. ans:=;
  40. cnt:=;
  41. head^.val:=; tail^.val:=;
  42. head^.next:=tail; tail^.last:=head;
  43. head^.last:=nil; tail^.next:=nil;
  44. end;
  45.  
  46. function gcd(a,b:int64):int64; inline;
  47. begin
  48. if a mod b= then exit(b)
  49. else exit(gcd(b,a mod b));
  50. end;
  51.  
  52. function max(x,y:int64):int64; inline;
  53. begin
  54. if x>y then exit(x)
  55. else exit(y);
  56. end;
  57.  
  58. procedure main;
  59. var t,value:int64; i:longint; p:edge;
  60. begin
  61. read(t);
  62. new(head); new(tail);
  63. while t<> do
  64. begin
  65. dec(t);
  66. init;
  67. read(n);
  68. ans:=;
  69. for i:= to n do
  70. begin
  71. read(value);
  72. addedge(i,value);
  73. p:=head^.next;
  74. while p<>tail do
  75. begin
  76. p^.val:=gcd(p^.val,value);
  77. ans:=max(ans,p^.val*(i-p^.pos+));
  78. if p^.val=p^.last^.val then delete(p^.last);
  79. p:=p^.next;
  80. end;
  81. end;
  82. writeln(ans);
  83. end;
  84. end;
  85.  
  86. begin
  87. main;
  88. end.

CERC 2013 Magical GCD的更多相关文章

  1. 4052: [Cerc2013]Magical GCD

    4052: [Cerc2013]Magical GCD Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 148  Solved: 70[Submit][ ...

  2. 【BZOJ】【4052】【CERC2013】Magical GCD

    DP/GCD 然而蒟蒻并不会做…… Orz @lct1999神犇 首先我们肯定是要枚举下端点的……嗯就枚举右端点吧…… 那么对于不同的GCD,对应的左端点最多有log(a[i])个:因为每次gcd缩小 ...

  3. Magical GCD UVA 1642 利用约数个数少来优化 给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量的值最大。输出这个最大值。

    /** 题目:Magical GCD UVA 1642 链接:https://vjudge.net/problem/UVA-1642 题意:给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量 ...

  4. 【BZOJ4052】[Cerc2013]Magical GCD 乱搞

    [BZOJ4052][Cerc2013]Magical GCD Description 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12.  求一个连续子序列,使得在所有的连续 ...

  5. [BZOJ4052][Cerc2013]Magical GCD

    [BZOJ4052][Cerc2013]Magical GCD 试题描述 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12.  求一个连续子序列,使得在所有的连续子序列中,它们 ...

  6. UVA - 1642 Magical GCD 数学

                                  Magical GCD The Magical GCD of a nonempty sequence of positive integer ...

  7. 【NOIP2014模拟8.17】Magical GCD

    题目 对于一个由正整数组成的序列, Magical GCD 是指一个区间的长度乘以该区间内所有数字的最大公约数.给你一个序列,求出这个序列最大的 Magical GCD. 分析 根据暴力的思想, \( ...

  8. BZOJ 4052: [Cerc2013]Magical GCD

    以一个数字开头的子序列的gcd种类不会超过logn种,因此去找相同gcd最长的位置,更新一下答案,复杂度O(nlogn^2) #include<cstdio> #include<al ...

  9. uva 1642 Magical GCD

    很经典的题目,愣是没做出来.. 题意:给出一个序列,求一子序列,满足其GCD(子序列)* length(子序列)最大. 题解: 类似单调队列的思想,每次将前面所得的最大公约数与当前数进行GCD,若GC ...

随机推荐

  1. 通过SecureCRT下载远程Linux服务器上的文件到本地Windows

    sz  文件名[先cd到需要下载的文件的目录层] [root@is13084905-0233 bookinterface]# sz test.txt rz Starting zmodem transf ...

  2. spring schema自定义

    今天看了一下分布式服务框架的那本书,于是里面提到了spring schema的自定义,于是去简单的了解了一下 参考资源:spring schema扩展: http://www.yihaomen.com ...

  3. Fiddler [Fiddler] Connection to localhost. failed.

    原文地址:http://blog.chinaunix.net/uid-20675015-id-1899931.html 在用Fiddler调试本机的网站时,即访问http://localhost,返回 ...

  4. vcredist作用

    一.vcredist作用: vcredist_x86.exe是微软公司Visual C++的32位运行时库,包含了一些Visual C++的库函数. vcredist_x64.exe是微软公司Visu ...

  5. iphone 4 safrai fixed

    <script type="text/javascript"> if(navigator.userAgent.indexOf("Safari")&g ...

  6. 转: git常用命令

    # git配置 #---------------------------------------------- #配置用户名和邮箱: $ git config --global user.name & ...

  7. android数据库持久化框架

    android数据库持久化框架

  8. [转贴]JavaScript中Array(数组)的属性和方法

    数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8); var c = new Array("first", &qu ...

  9. c++程序内存泄露检測工具

    功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...

  10. 万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》

    ds max文件夹,插件文件夹以及3ds max的可执行程序文件夹: 位的,这里要改成x64,否则启动程序后3ds max会提示"不是有效的win32程序"之类的对话框. 然后要将 ...