问题
难度:普及-
说明:
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