游游有一个长度为
的数组,每个数的权值为它的质因子个数。现在游游想要删除一段长度刚好为
的子数组,删除后需要使剩下的数的权值和最大。问这个权值和是多少?
第一行两个整数。
接下来一行个正整数
。
输出一个整数,表示答案。
5 2 6 2 4 1 3
4
1没有质因子,权值为0。2的质因子是2,权值为1。3的质因子是3,权值为1。4的质因子是2,权值为1。6的质因子是2和3,权值为2。删除子数组 [4,1],剩下的数是6,2,3,权值总和为4。
#include <bits/stdc++.h>
using namespace std;
signed main() {
int n, k;
cin >> n >> k;
vector<int> pre(n + 10), suf(n + 10), cnt(n + 10);
// cnt[i]表示第i个数字不同质因数的个数
// pre[i]表示从第1个数字的不同质因数个数加到第i个数字的不同质因数个数
// suf[i]表示从第i个数字的不同质因数个数加到第n个数字的不同质因数个数
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
int count = 0, b = a; // count代表数字a有多少个不同的质因数
for (int j = 2; j <= a / j; j++) { // 进行质因数分解
if (b % j == 0) {
count ++ ;
while (b % j == 0) b /= j;
}
}
if (b > 1) count ++ ;
cnt[i] = count;
pre[i] = pre[i - 1] + cnt[i]; // 前缀和
}
for (int i = n; i; i--) suf[i] = suf[i + 1] + cnt[i]; // 后缀和
int ma = 0;
for (int i = 1; i + k - 1 <= n; i++) {
ma = max(ma, pre[i - 1] + suf[i + k]); // 求答案
}
cout << ma << '\n';
return 0;
} import sys,heapq
n,k=list(map(int,input().strip().split()))
a=list(map(int,input().strip().split()))
def cnt_prime(u):
ans=0
i=2
while i<=u:
if u%i==0:
while u%i==0:
u=u//i
ans+=1
i+=1
return ans
prisum=[0]*(n+1)
for i in range(n):
prisum[i+1]=prisum[i]+cnt_prime(a[i])
m=float('inf')
for i in range(1,n+1):
j=i-k
if j>=0:
m=min(m,prisum[i]-prisum[j])
print(prisum[n]-m)
为啥超时了