[洛谷刷题-C++]P3131-Subsequences Summing to Sevens S

这篇博客介绍了如何解决洛谷P3131题目,即寻找数组中和能被7整除的最长子串。通过分析,作者提出了一种类比two sum的方法,通过计算区间和的差值模7为0来找到符合条件的子序列,从而降低时间复杂度,避免了暴力解法的时间复杂度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

难度:普及-

说明:

https://www.luogu.com.cn/problem/P3131

输入一个数组,求一个和能被 7 整除的最长子串。

输入范围:

输入长度 :1≤N≤50,000

输入数字大小:0…1,000,000

输入案例:

7
3
5
1
6
2
14
10

我的代码:

比较考数学题,如果直接暴力的话 n! 时间复杂度,即使是逐级 sum[i] = sum[i - 1] + N,然后 % 7,得出最长还是需要 n^2 时间复杂度,依然不行,那就成了做数学题:

想起 two sum 的解法,可以类比得出可被7整除的 区间和的区间长度:

区间 M 包括 N 和 X,ΣM = ΣN + ΣX,而

ΣM % 7 = 1,ΣN % 7 = 1

ΣM % 7 - ΣN % 7 = 0

(ΣM - ΣN) % 7 = 0

ΣX % 7 = 0  ——————>  可以从大区间 M 如果找到里面有一个区间 N,那么两者相减,就得出被 7 整除的区间 X,如果 N 尽可能小,就得出 X 是最长的被 7 整除的区间,那么得出 X,先得出 N,就是获取 M 的结束位置和 N 的开始位置。(ΣM % 7 = ΣN % 7,两者对 7 的余数相同的位置)

上 c++

#include <iostream>
using 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值