小豆現在有乙個數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 組輸入。對於每一組輸入,第一行是...