《牛客競賽 子段乘積》的題解

2021-10-02 18:01:49 字數 1409 閱讀 1315

給出乙個長度為 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...