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