線段樹 數學計算

2022-02-02 05:57:29 字數 1479 閱讀 4832

小豆現在有乙個數x,初始值為1. 小豆有q次操作,操作有兩種型別: 1 m: x = x * m ,輸出 x%mod; 2 pos: x = x / 第pos次操作所乘的數(保證第pos次操作一定為型別1,對於每乙個型別1 的操作至多會被除一次),輸出x%mod

一共有t組輸入(t ≤ 5) 對於每一組輸入,第一行是兩個數字q, mod(q ≤ 100000, mod ≤ 1000000000); 接下來q行,每一行為操作型別op,操作編號或所乘的數字m(保證所有的輸入都是合法的). 1 ≤ q ≤ 100000

對於每乙個操作,輸出一行,包含操作執行後的x%mod的值

110 1000000000

1 22 1

1 21 10

2 32 4

1 61 7

1 12

2 7212

201016

42504

84比較簡單的一道線段樹了 我們建立一棵線段樹,其葉子節點 i ii 儲存的是第 i 次操作時乘的那個值 那麼對於操作二,就是單點修改為1即可

#include#define in read()

#define lson (rt<<1)

#define rson (rt<<1)|1

#define maxn 100009

#define ll long long

using

namespace

std;

intt,q,mod,m,caoz;

ll dis[maxn

<<2

];void build(int rt,int l,int

r)

int mid=l+r>>1

; build(lson,l,mid);build(rson,mid+1

,r);

dis[rt]=dis[lson]*dis[rson];

}void insert(int rt,int l,int r,int

now,ll x)

int mid=l+r>>1

;

if(now<=mid)

insert(lson,l,mid,now,x);

else insert(rson,mid+1

,r,now,x);

dis[rt]=dis[lson]*dis[rson]%mod;

}void change(int rt,int l,int r,int now,int

x)

int mid=l+r>>1

;

if(now<=mid) change(lson,l,mid,now,x);

else change(rson,mid+1

,r,now,x);

dis[rt]=dis[lson]*dis[rson]%mod;

}int

main()

else}}

return0;

}

TJOI2018 數學計算(線段樹)

描述 小豆現在有乙個數 x xx 初始值為 1 11 小豆有 q qq 次操作,操作有兩種型別 1 11 m x x m x x m x x m 輸出 xxxm od modmodmm m 2 pos pospo s x x x x x x 第 pos 次操作所乘的數 保證第 pos pospo s...

TJOI2018 數學計算(線段樹)

題目描述 因為我在學校做過類似的題,所以這題一眼秒了 這題我們首先會想到乘法逆元,但發現不太可做。這時我們仔細考慮平衡樹,發現我們可以按照操作得到乙個陣列。最後通過線段樹查詢所有數的乘積。對於操作1,我們可以將陣列第i ii個數由1變為xxx 對於操作2,我們可以將陣列第i ii個數的值變為1 輸出...

數學計算 LibreOJ 2573 線段樹

小豆現在有乙個數 x 初始值為 1 小豆有 q 次操作,操作有兩種型別 1 m x x m 輸出 xmodm 2 pos x x 第 pos 次操作所乘的數 保證第 pos 次操作一定為型別 1,對於每乙個型別 1 的操作至多會被除一次 輸出 xmodm 一共有 t 組輸入。對於每一組輸入,第一行是...