题目分享G 三代目

题意:

小豆现在有一个数 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;
}
原文地址:https://www.cnblogs.com/lin4xu/p/12969414.html