2020牛客寒假算法基础集训营4 子段乘积

https://ac.nowcoder.com/acm/contest/3005/C

题意

  给出一个长度为 n 的数列 a1,a2,…,an,求其长度为 k 的连续子段的乘积对 998244353 取模余数的最大值。

题解

  尺取法。

代码

#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353;
long long arr[200005];
long long inv(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        b/=2;
        a=(a*a)%mod;
    }
    return ans;
}
int main()
{
    long long ans=-1,temp=1,cnt=0,i,n,k;
    scanf("%lld%lld",&n,&k);
    for(i=0;i<n;i++) scanf("%lld",&arr[i]);
    for(i=0;i<k;i++)
    {
        if(arr[i]==0) cnt++;
        else temp=temp*arr[i]%mod;
    }
    for(i=0;i<n-k;i++)
    {
        if(!cnt) ans=max(ans,temp);
        
        if(arr[i]==0) cnt--;
        else temp=temp*inv(arr[i],mod-2)%mod;

        if(arr[i+k]==0) cnt++;
        else temp=temp*arr[i+k]%mod;
    }
    printf("%lld",ans);
    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/VividBinGo/p/12308463.html
今日推荐