BZOJ5334:[TJOI2018]数学计算——题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ5334:[TJOI2018]数学计算——题解相关的知识,希望对你有一定的参考价值。

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]数学计算——题解的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ5334:[TJOI2018]数学计算——题解

BZOJ5334 [TJOI2018] 数学计算 线段树分治

bzoj5334: [Tjoi2018]数学计算

[TJOI2018] 数学计算

[TJOI2018] 数学计算

TJOI 2018 数学计算

(c)2006-2024 SYSTEM All Rights Reserved IT常识