【BZOJ4052】[Cerc2013]Magical GCD

Description

给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12。 
求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大。

Sample Input

1
5
30 60 20 20 20

Sample Output

80

题解:先思考暴力的做法。我们从一个数开始往左扫,将所有使得gcd改变的位置都记录下来。由于gcd的每次改变都至少/2,所以这样的位置不超过log个。

那么我们直接从左往右扫,暴力维护所有使得gcd改变的位置即可。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn=100010;
int n,m,k;
ll ans;
struct node
{
int x;
ll g;
}p[maxn],q[maxn];
ll gcd(ll a,ll b)
{
return (!b)?a:gcd(b,a%b);
}
inline ll rd()
{
ll ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void work()
{
n=rd(),ans=0;
int i,j;
ll v;
m=0;
for(i=1;i<=n;i++)
{
v=rd();
for(j=1;j<=m;j++) p[j].g=gcd(p[j].g,v);
p[++m].g=v,p[m].x=i;
for(k=0,j=1;j<=m;j++) if(p[j].g>p[j-1].g) q[++k]=p[j];
for(j=1;j<=k;j++) p[j]=q[j],ans=max(ans,(i-p[j].x+1)*p[j].g);
m=k;
}
printf("%lld\n",ans);
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}

最新文章

  1. python 之初体验
  2. react7 react 三目运算
  3. nodejs搭建http-server
  4. Monty Hall Problem的一个图解,感觉不错
  5. media query学习笔记
  6. nginx入门(安装,启动,关闭,信号量控制)
  7. java.sql.SQLException: 对只转发结果集的无效操作: last
  8. projecteuler Smallest multiple
  9. 89C51单片机定时器控制的流水灯
  10. linux 命令学习日记 20160621
  11. TortoiseSVN客户端重新设置用户名和密码[转]
  12. rpm打包过程
  13. 线性筛素数和理解 洛谷P3383
  14. pytorch 损失函数
  15. No input file specified.
  16. Redis数据结构之字符串
  17. Excel 常用设置
  18. 乞丐版servlet容器第4篇
  19. css的高级选择器,后代选择器,子代选择器,并集选择器,交集选择器
  20. hihocoder1322 树结构判定(161周)

热门文章

  1. 【转载】NonEmpty和Non Empty的区别
  2. python第三方库安装-多种方式
  3. koa2 从入门到进阶之路 (三)
  4. 洛谷——P1713 麦当劳叔叔的难题
  5. 分享Kali Linux 2017年第18周镜像文件
  6. php中for与foreach对比
  7. 查看tomcat启动文件都干点啥---Catalina.java
  8. 调试SQLSERVER (一)生成dump文件的方法
  9. redis--服务器与客户端
  10. readis 内部数据结构