题目链接
其实这个用线段树写就可以了
大神的线段树博客
只是把加换成了乘;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const ll maxn=1e6+5;
ll sum[maxn<<2];
ll a[maxn],n;
void qiuhe(ll rt){ //构造求和函数,给sum赋值。
sum[rt]=sum[rt<<1]*sum[rt<<1|1];
sum[rt]%=mod;
}
void shu(ll l,ll r,ll rt){ //构造树。
if(l==r){
sum[rt]=a[l];
return;
}
ll m=(l+r)>>1;
shu(l,m,rt<<1);
shu(m+1,r,rt<<1|1);
qiuhe(rt);
}
ll blqh(ll q,ll w,ll l,ll r,ll rt){ //写遍历求和函数。
if(q<=l&&w>=r){
return sum[rt];
}
ll m=(l+r)>>1;
ll ans=1;
if(q<=m){
ans*=blqh(q,w,l,m,rt<<1);
ans%=mod;
}
if(w>m){
ans*=blqh(q,w,m+1,r,rt<<1|1);
ans%=mod;
}
return ans;
}
int main()
{
ll k;
cin>>n>>k;
for(ll i=1;i<=n;i++){
cin>>a[i];
}
shu(1,n,1);
long long xmx=0;
for(int i=1;i<=n-k+1;i++)
{
xmx=max(xmx,blqh(i,i+k-1,1,n,1));
}
cout<<xmx%mod<<endl;
system("pause");
}