[Cerc2013]Magical GCD
2024-10-11 20:19:19
https://vjudge.net/problem/UVA-1642
题意:在一个序列中,找出一段连续的序列,使得长度*gcd最大
固定右端点,当左端点从左向右移动时,gcd不变或变大
gcd相同时,序列越长越好
所以相同的gcd只记录最靠左的位置
当右端点由r转移向r+1时
重新计算gcd,然后去重
gcd最多只会有log个
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 100001
using namespace std;
typedef long long LL;
LL a[N];
void read(LL &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
struct node
{
int sum,s[];
LL gcd[];
}cur,nxt;
LL getgcd(LL a,LL b) { return !b ? a : getgcd(b,a%b); }
int main()
{
int T,n;
LL ans,g;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
read(a[i]);
cur.gcd[]=a[]; cur.sum=cur.s[]=;
ans=a[];
for(int r=;r<=n;r++)
{
nxt.sum=;
nxt.s[]=cur.s[];
nxt.gcd[]=getgcd(cur.gcd[],a[r]);
for(int l=;l<=cur.sum;l++)
{
g=getgcd(cur.gcd[l],a[r]);
if(g!=nxt.gcd[nxt.sum])
{
ans=max(ans,nxt.gcd[nxt.sum]*(r-nxt.s[nxt.sum]+));
nxt.sum++;
nxt.gcd[nxt.sum]=g;
nxt.s[nxt.sum]=cur.s[l];
}
}
ans=max(ans,nxt.gcd[nxt.sum]*(r-nxt.s[nxt.sum]+));
if(a[r]!=nxt.gcd[nxt.sum])
{
nxt.gcd[++nxt.sum]=a[r],nxt.s[nxt.sum]=r;
ans=max(ans,a[r]);
}
cur=nxt;
}
printf("%lld\n",ans);
}
}
最新文章
- Python3基础 列表之间+ 合并,不去除重复项
- 【HTML】HTML特殊符号【转http://www.cnblogs.com/web-d/archive/2010/04/16/1713298.html】
- javaweb--下载文件列出
- eclipse Juno Indigo Helios Galileo 版本
- ios外派—本公司长年提供ios程序员外派业务(北京动点软件,可签合同)
- jquery网页字体变大小
- 关于Linux的windows目录的挂载
- Spark Streaming揭秘 Day22 架构源码图解
- Apache log4cxx用法
- C# windows窗体程序打包安装及卸载
- Spring MVC---基于注解的控制器
- about hibernate lazy load and solution
- Codeforces Round #350 (Div. 2)_D2 - Magic Powder - 2
- JS中的几种函数
- Maven-FAQ
- python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包
- Windows下GO的开发环境配置
- win2008server R2 x64 部署.net core到IIS--ASP .NET Core HTTP Error 502.5 – Process Failure
- Java的快速失败和安全失败
- phpmyadmin无登录表单无法登陆