模意义下除法若结果仍为整数的话,可以记录模数的所有质因子,计算这些质因子的次幂数,剩余的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. 网络流入门--最大流算法Dicnic 算法

    感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张.  ...

  2. fetch and js异步介绍

    http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html   Javascript异步编程的4种方法 ht ...

  3. windows下启动mysql服务的命令行启动和手动启动方法

    1.图形界面下启动mysql服务. 在图形界面下启动mysql服务的步骤如下: (1)打开控制面板->管理工具->服务,如下图所示: 可以看到Mysql服务目前的状态是未启动(未写已启动的 ...

  4. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

    在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...

  5. Java 注解全面解析

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  6. 在Unity中实现屏幕空间反射Screen Space Reflection(3)

    本篇讲一下相交检测的优化.有两个措施. 线段相交检测 之前的检测都是检测光线的终点是否在物体内.我们可以尝试检测光线的线段是否与物体相交. 比如说有一个非常薄的物体,光线差不多垂直于它的表面.如果用普 ...

  7. Kali设置代理

    原文:Kali-linux设置ProxyChains ProxyChains是Linux和其他Unices下的代理工具.它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP.SO ...

  8. 127.0.0.1、localhost、0.0.0.0的区别

    在开发web应用的测试环境中,如果希望同一个局域网的同事通过内网IP访问自己的应用,则需要把web服务监听的ip地址改为0.0.0.0.为什么用127.0.0.1不行,而用0.0.0.0就可以呢? f ...

  9. 【Python学习】request库

    Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...

  10. 内存不够清理方法,costdown项目时如果裁剪不下来,也可以参考

    Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...