一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
992D - Nastya and a Game
二、解题报告
1、思路分析
这个题题目很吓人
因为看起来前缀和根本存不下,似乎没法算
这也提示我们似乎只需在小范围内枚举求解即可
题目的P / K = SUM也保证了我们P的计算不会太大
P的增长在数字不是1的时候显然会追上并甩开SUM * K
我们考虑P = SUM * K,允许最多有多少个非1数
SUM * K <= 2e5 * 1e8 * 1e5 = 2e18
也就是说我们最多乘log2e18 个2,再乘只能乘1
这也就说明我们计算区间积的范围内最多有60个左右的大于1的数
我们考虑把原数组中连续1合并,这样保证我们对每个下标往后暴力枚举不会过长
然后枚举起点暴力枚举计算答案即可
2、复杂度
时间复杂度: O(N logM)空间复杂度:O(N)
3、代码详解
N, k = map(int, input().split())
a = list(map(int, input().split()))
suf = [0] * N
suf[N - 1] = a[-1] == 1
for i in range(N - 2, -1, -1):
suf[i] = (a[i] == 1) * (suf[i + 1] + 1)
res = 0
tot = sum(a) * k
for i in range(N):
p = 1
s = 0
while i < N:
if suf[i]:
if p % k == 0 and 0 < p // k - s <= suf[i]:
res += 1
s += suf[i]
i += suf[i]
else:
if p > tot // a[i]:
break
p *= a[i]
s += a[i]
if p % k == 0 and p // k == s:
res += 1
i += 1
print(res)