题目
题目链接:https://ac.nowcoder.com/acm/contest/3005/C
思路
把前缀积求出来,每次的res=sum[i]/sum[i-k]!
不过要注意
分数取模要求逆元!!!
分数取模要求逆元!!!
分数取模要求逆元!!!
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
int mod=998244353;
int a[200010],sum[200010],l[200010];bool vis[200010];
ll qmi(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
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 mmax=0;l[0]=0;
//for(int i=1;i<=n;i++) cout<<sum[i]<<endl;
for(int i=k;i<=n;i++){
if(l[i]==l[i-k]&&sum[i]*qmi(sum[i-k],mod-2)%mod>mmax){
mmax=sum[i]*qmi(sum[i-k],mod-2)%mod;//这个求逆元的方法知识和mod是质数的时候
}
}
cout<<mmax<<endl;
return 0;
}