1. 程式人生 > >BZOJ5334:[TJOI2018]數學計算——題解

BZOJ5334:[TJOI2018]數學計算——題解

stream OS 輸出 訪問 logs uri getchar getchar() TP

https://www.lydsy.com/JudgeOnline/problem.php?id=5334

小豆現在有一個數x,初始值為1. 小豆有Q次操作,操作有兩種類型: 1 m: x = x * m ,輸出 x%mod; 2 pos: x = x / 第pos次操作所乘的數(保證第pos次操作一定為類型1,對於每一個類型1 的操作至多會被除一次),輸出x%mod

都懶得寫題解了……就對著時間建一個線段樹,區間維護乘積即可。

真·大水題。

#include<cmath>
#include<queue>
#include
<cstdio> #include<cctype> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int Q=1e5+5; inline ll read(){ ll X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch==-;ch=getchar();} while(isdigit(ch))X=(X<<3
)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } int q; ll p,tr[Q*4]; inline void upt(int a){tr[a]=tr[a<<1]*tr[a<<1|1]%p;} void build(int a,int l,int r){ if(l==r){ tr[a]=1;return; } int mid=(l+r)>>1; build(a<<1,l,mid);build(a<<1|1
,mid+1,r); upt(a); } void mdy(int a,int l,int r,int x,ll y){ if(l==r){ tr[a]=y; return; } int mid=(l+r)>>1; if(x<=mid)mdy(a<<1,l,mid,x,y); else mdy(a<<1|1,mid+1,r,x,y); upt(a); } int main(){ int T=read(); while(T--){ q=read(),p=read(); build(1,1,q); for(int i=1;i<=q;i++){ int op=read(); if(op==1){ ll m=read(); mdy(1,1,q,i,m); }else{ int pos=read(); mdy(1,1,q,pos,1); } printf("%lld\n",tr[1]); } } return 0; }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

BZOJ5334:[TJOI2018]數學計算——題解