题意:
小豆现在有一个数 x ,初始值为 1 。 小豆有 Q 次操作,操作有两种类型:
1 m
: x=x×m ,输出 xmodM;
2 pos
: x=x/第 pos 次操作所乘的数(保证第 pos 次操作一定为类型 1,对于每一个类型 1 的操作至多会被除一次),输出 xmodM
分析:
由于M不一定为质数,所以不能用逆元解决,
所以用线段树求整个区间的乘积,
操作1,2相当于单点修改
代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long const int maxn=1e5+1; ll qans[maxn<<2]; int mod; void make_tree(int x,int l,int r) { qans[x]=1ll; if(l==r) return; int mid=l+r>>1; make_tree(x<<1,l,mid); make_tree(x<<1|1,mid+1,r); } void dfs(int x,int l,int r,int p,int q) { if(l==r) { qans[x]=(ll)q%mod; return; } int mid=l+r>>1; if(p<=mid) dfs(x<<1,l,mid,p,q); else dfs(x<<1|1,mid+1,r,p,q); qans[x]=qans[x<<1]*qans[x<<1|1]%mod; } int main() { int t,q,p,x; scanf("%d",&t); while(t--) { scanf("%d%d",&q,&mod); make_tree(1,1,q); for(int i=1;i<=q;i++) { scanf("%d%d",&p,&x); if(p==1) dfs(1,1,q,i,x); else dfs(1,1,q,x,1); printf("%lld ",qans[1]); } } return 0; }