嘘~ 正在从服务器偷取页面 . . .

洛谷P4588 [TJOI2018]数学计算 题解


洛谷P4588 [TJOI2018]数学计算 题解

题目链接:P4588 [TJOI2018]数学计算

题意

cxy 现在有一个数 \(x\),初始值为 \(1\)。cxy 有 \(Q\) 次操作,操作有两种类型:

1 m:将 \(x\) 变为 \(x \times m\),并输出 \(x \bmod M\)

2 pos:将 \(x\) 变为 \(x\) 除以第 \(\mathtt{pos}\) 次操作所乘的数(保证第 \(\mathtt{pos}\) 次操作一定为类型 \(1\),对于每一个类型 \(1\) 的操作至多会被除一次),并输出 \(x \bmod M\)

输入格式

一共有 \(t\) 组输入。

对于每一组输入,第一行是两个数字 \(Q,M\)

接下来 \(Q\) 行,每一行为操作类型 \(\mathtt{op}\),操作编号或所乘的数字 \(m\)(保证所有的输入都是合法的)。

输出格式

对于每一个操作,输出一行,包含操作执行后的 \(x \bmod M\) 的值。

数据范围

对于 \(100\%\) 的数据,\(1 \le Q \le 10^5\)\(t \le 5, M \le 10^9\)\(0 < m \leq 10^9\)

直接模拟是不行的。因为如果你要记录乘积,中间模过以后就不好搞除法了

逆元?不行,因为 \(M\) 没有保证是质数,所以可能不存在逆元。

如果记录每个数,那每次直接乘过去就是暴力了,显然不可行。

考虑优化暴力。众所周知 \(x \times 1 = x\)

因此我们还是可以维护这样的序列,对于每个除法操作,我们只要把对应位置的数改成 \(1\) 就好了

那这就是一个单点修改+区间查询乘积,线段树维护(我感觉树状数组也可以)

时间复杂度 \(\mathcal{O}(n \log n)\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)(1e5+15))

#define ls(at) (at << 1)
#define rs(at) (at << 1 | 1)

int n,mod,ans[N * 4];
void push_up(int at)
{ ans[at] = ans[ls(at)] * ans[rs(at)] % mod; }
void build(int l,int r,int at)
{
    if(l == r) { return ans[at] = 1, void(0); }
    int mid = (l+r) >> 1;
    build(l,mid,ls(at)); build(mid+1,r,rs(at));
    push_up(at);
}
void modify(int x,int k,int l=1,int r=n,int at=1)
{
    if(l == r) { return ans[at] = k, void(0); }
    int mid = (l+r) >> 1;
    if(x <= mid) modify(x,k,l,mid,ls(at));
    else modify(x,k,mid+1,r,rs(at));
    push_up(at);
}
void solve()
{
    cin >> n >> mod; build(1,n,1);
    for(int i=1,op,p; i<=n; i++)
    {
        cin >> op >> p;
        if(op & 1) { modify(i,p); }
        else { modify(p,1); }
        cout << ans[1] << '\n';
    }
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    int Q; cin >> Q; while(Q--) solve();
    return 0;
}

文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录