题意:给你n(n<=100000)个正整数,求一个连续子序列使序列的所有元素的最大公约数与个数乘积最大

题解:我们知道一个原理就是对于n+1个数与n个数的最大公约数要么相等,要么减小并且减小至少一半(至少少了一个因子)

   因此所有子串gcd的总种类数最多只有n*log(a(数字大小))个

   我们枚举每个点计算以这个点为结束点的所有后缀,利用dp的思想通过前一次计算的最多log(a)个gcd计算出此时也是最多log(a')个gcd

import java.util.Scanner;

public class Main{

    static int Max=100010;
static Long[] num=new Long[Max];
static Long[][] gcd=new Long[Max][100];//后缀的gcd值只可能有loga种
static int[][] len=new int[Max][100];//对应位置的长度 public static Long Gcd(Long i,Long j) {
if(j==0)
return i;
else
return Gcd(j, i%j);
} public static void main(String[] args) {
int t,n;
Scanner sc=new Scanner(System.in);
t=sc.nextInt();
while(t!=0){
n=sc.nextInt();
for(int i=0;i<n;++i){
num[i]=sc.nextLong();
}
System.out.println(SolveGcd(n));
t--;
}
} private static Long SolveGcd(int n) {
Long res=0L;
int coun,pre=0;
//从第一个开始计算后缀
for(int i=0;i<n;++i){ coun=0;
gcd[i][coun]=num[i];
len[i][coun]=1;
res=Math.max(res,num[i]);
coun++; //使用上一层后缀计算此层,并且注意删除相同的值
for(int j=0;j<pre;++j){
gcd[i][coun]=Gcd(num[i], gcd[i-1][j]);
len[i][coun]=len[i-1][j]+1;
res=Math.max(res, gcd[i][coun]*len[i][coun]);
if(gcd[i][coun].equals(gcd[i][coun-1])){//gcd相同时存总个数
len[i][coun-1]=len[i][coun];
}else{
coun++;
}
}
pre=coun;
}
return res;
}
}

最新文章

  1. 写给.NET开发者的数据库Migration方案
  2. 解决小米、红米及其他 Android 手机无法在 Mac 下进行真机调试的问题(转)
  3. c++作业:Circle
  4. 如何用SQL命令行工具删除dedecms指定id文章
  5. mysql 常用sql操作语句
  6. PowerDesigner(三)-企业架构模型(转)
  7. [LOJ 1038] Race to 1 Again
  8. HW2.5
  9. Hacker(16)----防范端口扫描与嗅探
  10. BOOST_PP_INC_I(x)实现
  11. WebService使用入门(包括发布服务,调用服务)
  12. ubuntu下安装多个jdk的切换命令update-alternatives
  13. python学习之列表和字典
  14. maven jar包冲三种解决方式
  15. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
  16. jqGrid选择列控件向右拖拽超出边界处理
  17. 【相关网站 - 02】- Java 好文博客
  18. Zabbix3.4监控平台部署
  19. Codeforces 1090A - Company Merging - [签到水题][2018-2019 Russia Open High School Programming Contest Problem A]
  20. scrapy 日志处理

热门文章

  1. Android studio 使用技巧和问题
  2. Linux下的信号机制
  3. Mysql2索引
  4. java爬取网页内容 简单例子(1)——使用正则表达式
  5. ubuntu安装markdown
  6. Jmeter(九)压力测试
  7. Spark 2.2 DataFrame的一些算子操作
  8. java堆结构和垃圾回收
  9. Oracle 性能调优 SQL_TRACE
  10. Charles 抓包工具的使用