zhangjinxuan 发表于 2023-6-5 18:59:16

区间 gcd 与总和的和最大值问题,这个问题有点不会,望高人赐教,谢谢【重金悬赏】

本帖最后由 zhangjinxuan 于 2023-6-6 11:45 编辑

【重金悬赏】是吸引你点进来的,但是真的有重金悬赏。

这个题想了亿天了,决定来问亿问。
题目描述

给定一个长度为 n 的正整数序列 a,请找到两个数 l, r,使 gcd(al, al+1, ..., ar) + al, al+1, ..., ar 最大,输出 l, r,并且输出这个最大值。

gcd 表示最大公因数。

例如:
4
9 8 16 24
输出:

2 4
56

解释:gcd(8, 16, 24) + 8 + 16 + 24 = 56,这是最大的。

数据范围:

1 <= n <= 1000000

a 的所有元素都大于等于 1,小于等于 1000000。



想了很久也没有什么头绪,望高人赐教。

@陈尚涵 @额外减小 @tommyyu

成功解决者,额外赏 30 鱼币。

sfqxx 发表于 2023-6-5 19:03:01

不会,也不敢问 gpt

liuzhengyuan 发表于 2023-6-5 19:12:34

一个区间可以包含整个吗?

zhangjinxuan 发表于 2023-6-5 20:57:30

liuzhengyuan 发表于 2023-6-5 19:12
一个区间可以包含整个吗?

可以

zhangjinxuan 发表于 2023-6-5 21:00:06

最近高考啊,现在冷清啊。

liuhongrun2022 发表于 2023-6-5 21:09:31

不会

sfqxx 发表于 2023-6-5 22:15:14

{:10_250:}

from collections import defaultdict

def factor_sieve(n):
    """
    返回一个list,表示小于等于n的所有数的最小质因子
    """
    sieve = * (n + 1)
    for i in range(2, n + 1):
      if sieve == 0:# i是质数
            for j in range(i * i, n + 1, i):
                if sieve == 0:
                  sieve = i
    return sieve

def get_factor_counts(sieve, x):
    """
    返回x的所有质因子的出现次数的和,如20=2*2*5,返回4+1=5
    """
    counts = defaultdict(int)
    while x > 1:
      prime = sieve
      if prime == 0:
            prime = x
      counts += 1
      x //= prime
    return sum(counts.values())

n = int(input())
a = list(map(int, input().split()))

sieve = factor_sieve(max(a))

# 预处理每个数在各个质因子下的出现次数,放到二维数组counts中
counts = [ * len(sieve) for _ in range(n)]
for i in range(n):
    for j in range(len(sieve)):
      if a % (j+1) == 0:
            counts = get_factor_counts(sieve, a // (j+1))

# 计算每个左端点和右端点的区间公因数及其总和,找到最大值
best_l, best_r, best_value = -1, -1, 0
for l in range(n):
    prod_counts = * len(sieve)
    for r in range(l, n):
      for j in range(len(sieve)):
            prod_counts += counts
      # 计算当前区间的公因数及其总和
      factor = 1
      sum_of_divisors = 0
      for j in range(len(sieve)):
            if prod_counts == r - l + 1:
                factor *= (j+1)
            sum_of_divisors += prod_counts * (j+1)
      value = factor + sum_of_divisors
      # 更新最大值
      if value > best_value:
            best_l, best_r, best_value = l, r, value

print(best_l+1, best_r+1)
print(best_value)

额外减小 发表于 2023-6-6 00:10:16

sfqxx 发表于 2023-6-5 22:15


sfqxx 发表于 2023-6-6 06:52:11

额外减小 发表于 2023-6-6 00:10


不是我做的

zhangjinxuan 发表于 2023-6-6 07:25:13

sfqxx 发表于 2023-6-5 22:15


时间复杂度怎么算{:10_277:}

zhangjinxuan 发表于 2023-6-6 07:51:40

本帖最后由 zhangjinxuan 于 2023-6-6 07:56 编辑

sfqxx 发表于 2023-6-5 22:15


37 行,j 应该是第几个质数,所以不应该是 a[ i] % sieve == 0 吗?

还有,你这样的时间复杂度是 n^2 啊,n^2 的算法很简单的。

我问 chatgpt 5 遍都是 n^2 算法{:10_250:}

zhangjinxuan 发表于 2023-6-6 07:52:07

本帖最后由 zhangjinxuan 于 2023-6-6 07:56 编辑

额外减小 发表于 2023-6-6 00:10


他时间复杂度 n^2{:10_250:}

zhenjen 发表于 2023-6-6 10:38:13

a是正整数序列,最大的连续区间怎么理解?

zhenjen 发表于 2023-6-6 10:47:44

使这个区间的公因数与总和的和的值最大
//使区间公因数的值最大。总和的值最大。
这题表达有问题(个人观点)

zhangjinxuan 发表于 2023-6-6 11:08:50

zhenjen 发表于 2023-6-6 10:47
使这个区间的公因数与总和的和的值最大
//使区间公因数的值最大。总和的值最大。
这题表达有问题(个人观 ...


使这个区间的 最大公因数 与 数字总和 的和的值最大

zhangjinxuan 发表于 2023-6-6 11:11:33

zhenjen 发表于 2023-6-6 10:47
使这个区间的公因数与总和的和的值最大
//使区间公因数的值最大。总和的值最大。
这题表达有问题(个人观 ...

行吧,还是用形式化的语言来说(

zhenjen 发表于 2023-6-6 11:14:44

zhangjinxuan 发表于 2023-6-6 11:08
使这个区间的 最大公因数 与 数字总和 的和的值最大

问下,输出的2 4是什么意思?

zhangjinxuan 发表于 2023-6-6 11:20:59

zhenjen 发表于 2023-6-6 11:14
问下,输出的2 4是什么意思?

就是 l, r

zhenjen 发表于 2023-6-6 11:27:16

个人思路:1.找包含公因数的区间。h=gcd()+包含公因数区间k,记录左右端点。n=h。2.加if(h>n)更新记录点。3.重复
继续找包含公因数的区间与

zhangjinxuan 发表于 2023-6-6 11:30:36

zhenjen 发表于 2023-6-6 11:27
个人思路:1.找包含公因数的区间。h=gcd()+包含公因数区间k,记录左右端点。n=h。2.加if(h>n)更新记录 ...

给定一个正整数序列 a,请找到两个数 l, r,使 gcd(al, al+1, ..., ar) + al, al+1, ..., ar 最大,输出 l, r,并且输出这个最大值。

gcd 表示最大公因数。
页: [1] 2 3
查看完整版本: 区间 gcd 与总和的和最大值问题,这个问题有点不会,望高人赐教,谢谢【重金悬赏】