模意义下除法若结果仍为整数的话,可以记录模数的所有质因子,计算这些质因子的次幂数,剩余的exgcd解决。

$O(n\log n)$但有9的常数(1e9内的数最多有9个不同的质因子),T了。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int T,n,mod,op,w,tot,res,x,d[N][],p[],s[]; void frac(int n){
for (int i=; i*i<=n; i++) if (n%i==){
p[++tot]=i;
while (n%i==) n/=i;
}
if (n>) p[++tot]=n;
} void exgcd(int a,int b,int &x,int &y){
if (!b) x=,y=;
else exgcd(b,a%b,y,x),y-=a/b*x;
} int main(){
freopen("bzoj5334.in","r",stdin);
freopen("bzoj5334.out","w",stdout);
for (scanf("%d",&T); T--; ){
scanf("%d%d",&n,&mod); tot=; res=; frac(mod);
rep(i,,) s[i]=;
rep(i,,n){
scanf("%d",&op);
if (op==){
scanf("%d",&w);
rep(j,,tot) d[i][j]=;
rep(j,,tot)
while (w%p[j]==) w/=p[j],d[i][j]++,s[j]++;
int x,y; res=1ll*res*w%mod;
exgcd(w,mod,x,y); d[i][]=(x%mod+mod)%mod;
int ans=res;
rep(j,,tot) rep(k,,s[j]) ans=1ll*ans*p[j]%mod;
printf("%d\n",ans);
}else{
scanf("%d",&x); res=1ll*res*d[x][]%mod;
rep(j,,tot) s[j]-=d[x][j];
int ans=res;
rep(j,,tot) rep(k,,s[j]) ans=1ll*ans*p[j]%mod;
printf("%d\n",ans);
}
}
}
return ;
}

删除操作难以维护的话,考虑线段树分治即可。

 #include<cstdio>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int T,n,mod,x,op,tag[N<<];
struct P{ int l,r,v; }p[N]; void push(int x){
tag[ls]=1ll*tag[ls]*tag[x]%mod;
tag[rs]=1ll*tag[rs]*tag[x]%mod;
tag[x]=;
} void build(int x,int L,int R){
tag[x]=;
if (L==R) return;
int mid=(L+R)>>;
build(lson); build(rson);
} void ins(int x,int L,int R,int l,int r,int k){
if (L==l && r==R){ tag[x]=1ll*tag[x]*k%mod; return; }
int mid=(L+R)>>;
if (r<=mid) ins(lson,l,r,k);
else if (l>mid) ins(rson,l,r,k);
else ins(lson,l,mid,k),ins(rson,mid+,r,k);
} int que(int x,int L,int R,int pos){
if (L==R) return tag[x];
int mid=(L+R)>>; push(x);
if (pos<=mid) return que(lson,pos); else return que(rson,pos);
} int main(){
for (scanf("%d",&T); T--; ){
scanf("%d%d",&n,&mod);
rep(i,,n){
scanf("%d",&op);
if (op==) scanf("%d",&x),p[i]=(P){i,n,x};
else scanf("%d",&x),p[x].r=i-,p[i].l=;
}
build(,,n);
rep(i,,n) if (p[i].l) ins(,,n,p[i].l,p[i].r,p[i].v);
rep(i,,n) printf("%d\n",que(,,n,i));
}
return ;
}

[BZOJ5334][TJOI2018]数学计算(exgcd/线段树)的更多相关文章

  1. BZOJ5334 [TJOI2018] 数学计算 【线段树分治】

    题目分析: 大概是考场上的签到题.首先mod不是质数,所以不能求逆元.注意到有加入操作和删除操作.一个很典型的想法就是线段树分治.建立时间线段树然后只更改有影响的节点,最后把所有标记下传.时间复杂度是 ...

  2. 【BZOJ5334】数学计算(线段树)

    [BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...

  3. 洛谷P4588 [TJOI2018]数学计算 【线段树】

    题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...

  4. P4588 [TJOI2018]数学计算 (线段树)

    用线段树维护操作序列,叶子结点存要乘的数,非叶子结点存区间乘积,每次输出tr[1] 就是答案. 1 #include<bits/stdc++.h> 2 #define ll long lo ...

  5. BZOJ5334: [Tjoi2018]数学计算

    BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...

  6. BZOJ 5334--[Tjoi2018]数学计算(线段树)

    5334: [Tjoi2018]数学计算 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 220  Solved: 147[Submit][Status ...

  7. BZOJ5334:[TJOI2018]数学计算(线段树)

    Description 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型:  1 m: x = x  *  m ,输出 x%mod; 2 pos: x = x /  第pos次操作所乘 ...

  8. 2018.06.26「TJOI2018」数学计算(线段树)

    描述 小豆现在有一个数 xxx ,初始值为 111 . 小豆有 QQQ 次操作,操作有两种类型: 111 $ m$ : x=x×mx=x×mx=x×m ,输出 xxx modmodmod MMM : ...

  9. [Tjoi2018]数学计算

    [Tjoi2018]数学计算 BZOJ luogu 线段树分治 是不是想问为什么不暴力做? 模数没说是质数,所以不一定有逆元. 然后就是要每次build一下把线段树权值init成1, 博猪不知道为什么 ...

随机推荐

  1. 【51NOD】1135 原根

    [题意]给定p,求p的原根g.3<=p<=10^9. [算法]数学 [题解]p-1= p1^a1 * p2^a2 * pk^ak,g是p的原根当且仅当对于所有的pi满足g^[ (p-1)/ ...

  2. 【NOIP】提高组2013 货车运输

    [算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...

  3. NYOJ 756 重建二叉树 (二叉树)

    题目链接 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开 ...

  4. react input 设置默认值

    1.text类型 <input type="text" value={默认值} />  ,这种写法可以显示默认值,但不能对输入框进行编辑 正确写法: <input ...

  5. weblogic 配置了ssl

    jingyan.baidu.com/article/72ee561abfe531e16138dfb5.html http://blog.sina.com.cn/s/blog_7ffec3e201019 ...

  6. perl6正则 1: ~~ , //, m//, rx//

    ~~ perl6 中, 要匹配一个正则, 使用 ~~ 智能匹配符. > so 'abcde' ~~ /a.c/ True > so 'abcde' ~~ /a.d/ False > ...

  7. Java Web 远程调试

    Java Web 远程 调试 Tomcat 下载压缩版服务器 环境:Tomcat.Eclipse,做远程调试我们并不需要其他特殊插件 1.配置Tomcat/bin/startup.bat 在前面增加代 ...

  8. PyQt实现测试工具

    测试工具: 1. 基本界面实现: # coding:utf-8 import sys import os import os.path import re import time from PyQt4 ...

  9. C/C++——C语言数组名与指针

    版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...

  10. HDU-2222

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...