給出乙個長度為 n 的數列 a1,a2,…an ,求其長度為 k 的連續子段的乘積對 998244353 取模餘數的最大值。
第一行兩個整數n,k。
第二行n個整數,a1,a2,…,an
輸出乙個整數,代表最大餘數。
531
2308
6
1 ≤ k ≤ n≤2∗1e5
0 ≤ ai <998244353
這一次解題我們需要用到逆元或者神奇的線段樹。
呃...由於我不會逆元,就學了線段樹hhhh.
一棵樹的節點為x,那麼它的左子樹的位置為x*2,右子樹的位置為x*2+1
那麼下面就是完整**啦
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const ll n=2*
1e5+2;
//輸入的最大長度
const ll mod=
998244353
;//取模用的
ll tree[
4*n]
;//為了實現樹,大小乘上4
void
woc(
int x)
void
bulid
(ll l,ll r,ll x)
ll mid=
(l+r)/2
;bulid
(l,mid,x*2)
;//創造左子樹
bulid
(mid+
1,r,x*2+
1);//創造右子樹
woc(x)
;//進行不可描述的操作(見上面的函式)
}ll gold
(ll a,ll b,ll l,ll r,ll x)
ll ans=
1,mid=
(l+r)/2
;if(a<=mid) ans=ans*
gold
(a,b,l,mid,x*2)
%mod;
//分別求出在中點左邊的部分
if(b>=mid+
1) ans=ans*
gold
(a,b,mid+
1,r,x*2+
1)%mod;
//以及右邊的部分
return ans;
}int
main()
printf
("%lld\n"
,ans)
;//然後輸出就完事啦
return0;
}
牛客 C 子段乘積(線段樹)
暴力 o n 2 o n 2 o n2 超時。用線段樹維護區間乘積的餘數,然後查詢區間 i,i k 1 i,i k 1 i,i k 1 即可。其中建樹的複雜度是 o n o n o n 查詢的時間複雜度是 o l ogn o logn o logn include include include i...
牛客網子段乘積
新增鏈結描述 include using namespace std typedef long long ll const int mod 998244353 ll quick ll a,ll b 快速冪 快速冪的迭 法 return ret 1 初始令ans 1,用來存放累積的結果。2 判斷b的二...
牛客第四場 子段乘積
線段樹的運用 線段樹真np 真好用,真強 題目鏈結 直接掃一遍維護區間 會出現 遇見 0 處理麻煩的問題 直接用線段樹 這一問題將會不復存在 將普通的區間加 變成 區間 就可!include include include include include include include includ...