1 1 1≤ k k k ≤ n n n≤ 2 ∗ 1 0 5 2 * 10^5 2∗105
0 ≤ a i ai ai < 998244353 998244353 998244353
前缀积,统计0的个数
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
#define PII piarll power(ll a,ll b)
const int mod=998244353;
int sum[200010],a[200010],l[200010];
bool vis[200010];
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
signed main()
{
int n,k; cin>>n>>k;
sum[0]=1;
int cnt=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0){
sum[i]=1;
cnt++;
}
else sum[i]=(sum[i-1]*a[i])%mod;
l[i]=cnt;
}
int Max=0;
l[0]=0;
for(int i=k;i<=n;i++){
ll ans=sum[i]*qpow(sum[i-k],mod-2)%mod;
if(l[i]==l[i-k]&&ans>Max) Max=ans;
cout<<Max<<endl;
}
}
逆元
(a/b)%mod=a
∗
*
∗c%mod
即a除b取模等于a乘b的逆元取模
费马小定理:模为质数
b的逆元:b^(mod-2)%mod
扩展欧几里得:模为质数
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x = 1;
y=0;
return a;
}
ll d = exgcd(b,a%b,y,x);
y -= a/b*x;
return d;
}
ll inv(ll a,ll mod){
ll x,y;
ll d =exgcd(a,mod,x,y);
if(d == 1){
return (x%mod+mod)%mod;
}
return -1;
}
signed main(){
ll ans = inv(b,mod); // 此时的b就是 a/b 中的 b
}