TJOI2018 數學計算(線段樹)

2021-08-21 00:12:38 字數 2440 閱讀 4047

描述

小豆現在有乙個數 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 次操作一定為型別 1

11,對於每乙個型別 1

11 的操作至多會被除一次),輸出 xxxm

od

modmodmm

m 。輸入

一共有 t

tt 組輸入。

對於每一組輸入,第一行是兩個數字 q,m

q,mq,

m。接下來 q

qq 行,每一行為操作型別 opop

op,操作編號或所乘的數字 m

mm (保證所有的輸入都是合法的)。

輸出

對於每乙個操作,輸出一行,包含操作執行後的xxxm

od

modmodmm

m 的值。

樣例輸入

110 1000000000

1 22 1

1 21 10

2 32 4

1 61 7

1 12

2 7樣例輸出21

220101

64250484

對於 20

20%20

的資料,$ 1\leq q \leq 500 $ ;

對於 100

100%

100 的資料, 1≤q

≤105

,t≤5

,m≤1

09

1\leq q \leq 10^5 , t\leq 5 , m \leq 10^9

1≤q≤10

5,t≤

5,m≤

109這個題可以看出是一道用線段樹維護根節點區間乘積的題,由於q

qq的值很小,所以可以設線段樹的根節點的左右指標為t[1

].l=

1,t[

1].r

=q

t[1].l=1,t[1].r=q

t[1].l

=1,t

[1].

r=q,當最初沒有修改時,所有葉子結點的值都為1

11,那麼整個區間的乘積就為1

11,即題上的x

xx,對於操作1

11,我們讓第i

ii個葉節點對應第i

ii次操作,如果第i

ii次操作為操作1

11,那麼我們將第i

ii個葉節點的值改為m

mm,否則第i

ii次操作是操作2

22,此時我們只需要將第pos

pospo

s個根節點改回1

11即可。

具體的**實現:

#include

#define lc (p<<1)

#define rc (p<<1|1)

#define mid (t[p].l+t[p].r>>1)

#define n 100005

using

namespace std;

int t,n;

long

long mod;

inline

long

long

read()

struct nodet[n<<2]

;inline

void

pushup

(int p)

inline

void

build

(int p,

int l,

int r)

inline

void

update

(int p,

int k,

int v)

if(k<=mid)

update

(lc,k,v)

;else

update

(rc,k,v)

;pushup

(p);

}int

main()

else

printf

("%lld\n"

,t[1

].mul);}

}return0;

}

TJOI2018 數學計算(線段樹)

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

TJOI2018 數學計算 線段樹

題面 題解 考場上看到這題,沒想到竟然是省選原題qaq,考場上把它當數學題想了好久,因為不知道怎麼處理有些數沒有逆元的問題。知道這是線段樹後恍然大悟。首先可以一開始就建出乙個長度為n的操作序列,初始值都是1,表示一開始預設是1乘上n個1,因為乘1也就相當於沒乘。對於操作1,直接將操作序列上對應的位置...

TJOI2018 數學計算 線段樹水題

描述 小豆現在有乙個數 x xx,初始值為 1 11 小豆有 q qq次操作,操作有兩種型別 1 11m mm x x m x x m x x m 輸出 xmo dm x mod m xmodm 2 22p os pospo s x x x x x x 第p os pospo s次操作所乘的數 保證...