描述第一眼還以為高精度乘除取膜小豆現在有乙個數 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,直接將操作序列上對應的位置...