TJOI2018 數學計算 線段樹水題

2021-09-08 20:39:04 字數 2320 閱讀 1421

描述

小豆現在有乙個數 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次操作所乘的數(保證第 pos

pospo

s 次操作一定為型別1

11,對於每乙個型別1

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

dm

x mod m

xmodm 。

輸入一共有 t

tt 組輸入。

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

q,mq,

m。接下來 q

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

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

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

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

dm

x mod m

xmodm的值

樣例輸入

110 1000000000

1 22 1

1 21 10

2 32 4

1 61 7

1 12

2 7樣例輸出21

220101

64250484

提示對於20%的資料,1≤q

≤500

1≤q≤500

1≤q≤50

0;對於100%的資料, 1≤q

≤105

,t≤5

,m≤1

09

1≤q≤10^5, t≤5,m≤10^9

1≤q≤10

5,t≤

5,m≤

109;

第一眼還以為高精度乘除取膜

瞬間放棄

第二眼線段樹水題

維護一下區間積,每次除把乙個點改回來就是了

#include

using

namespace std;

#define ll long long

inline

intread()

while

(isdigit

(ch)

)res=

(res<<3)

+(res<<1)

+(ch^48)

,ch=

getchar()

;return res*f;

}const

int n=

100005

;ll tr[n<<2]

,a[n]

,mod;

int t,n;

#define lc (u<<1)

#define rc ((u<<1)|1)

#define mid ((l+r)>>1)

inline

void

pushup

(int u)

inline

void

buildtree

(int u,

int l,

int r)

inline

void

update

(int u,

int l,

int r,

int pos,ll k)

if(pos<=mid)

update

(lc,l,mid,pos,k)

;else

update

(rc,mid+

1,r,pos,k)

;pushup

(u);

}inline

void

change

(int u,

int l,

int r,

int pos)

if(pos<=mid)

change

(lc,l,mid,pos)

;else

change

(rc,mid+

1,r,pos)

;pushup

(u);

}int

main()

else}}

}

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 輸出...

TJOI2018 數學計算 線段樹

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