题目大意:一个数X,最开始的值为1。有两个操作,操作1:让X乘y;操作2:让X除以第n次操作乘的那个数字y。
思路:此题可以利用线段树来搞,每次操作为更新节点。
思路:此题可以利用线段树来搞,每次操作为更新节点。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
const int maxn=100005;
int qq[maxn];
long long mod;
long long arr[maxn<<2];
void pushup(int o)
{
arr[o]=arr[o<<1]*arr[o<<1|1]%mod;
}
void build(int o,int l,int r)
{
if(l==r)
{
arr[o]=1;
return;
}
int m=(l+r)>>1;
build(o<<1,l,m);
build(o<<1|1,m+1,r);
pushup(o);
}
void update(int o,int l,int r,int p,int val)
{
if(l==r)
{
arr[o]=val;
return;
}
int m=(l+r)>>1;
if(p<=m)
update(o<<1,l,m,p,val);
else
update(o<<1|1,m+1,r,p,val);
pushup(o);
}
int main()
{
int T,kase=0,a,b;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d%lld",&n,&mod);
build(1,1,n);
printf("Case #%d:\n",++kase);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
if(a==1)
{
qq[i]=b;
update(1,1,n,i,b);
printf("%d\n",arr[1]);
}
else
{
qq[b]=1;
update(1,1,n,b,1);
printf("%d\n",arr[1]);
}
}
}
return 0;
}
610

被折叠的 条评论
为什么被折叠?



