HDU5475
题解:
- 因为有模所以不能轻易除。
- 逆元?可是不互质呢?
- 直接线段树处理。n次操作,每个叶子结点初始化为1,如果乘以某个数x,这个节点边为x;除以某个数,叶子结点变为1,维持区间的乘积。求的是node[1].sum。
代码:
#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
typedef long long ll;
int n,k,num,mod;
struct Node
{
int l,r;
ll sum;
}node[N<<2];
void push_up(int id){
node[id].sum = (node[id<<1].sum * node[id<<1|1].sum) % mod;
}
void build(int id,int l,int r){
node[id].l = l, node[id].r = r;
node[id].sum = 1;
if(l == r) return ;
else{
int mid = (l + r) >> 1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
}
}
void updata(int id,int pos,int k){
int l = node[id].l, r = node[id].r;
if(l == r) node[id].sum = k;
else{
int mid = (l + r) >> 1;
if(pos <= mid) updata(id<<1,pos,k);
else updata(id<<1|1,pos,k);
push_up(id);
}
}
int main(){
int T,caser = 0;
scanf("%d",&T);
while(T--){
printf("Case #%d:\n",++caser);
scanf("%d%d",&n,&mod);
build(1,1,n);
for(int i=1;i<=n;i++){
scanf("%d%d",&k,&num);
if(k == 1) updata(1,i,num); //第i个位置乘以num
else updata(1,num,1); //第num个位置变回1,相当于每有乘
printf("%lld\n",node[1].sum);
}
}
}