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

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

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 4 using namespace std;
 5
 6 const int N=100010;
 7 int T,n,mod,op,w,tot,res,x,d[N][11],p[11],s[11];
 8
 9 void frac(int n){
10     for (int i=2; i*i<=n; i++) if (n%i==0){
11         p[++tot]=i;
12         while (n%i==0) n/=i;
13     }
14     if (n>1) p[++tot]=n;
15 }
16
17 void exgcd(int a,int b,int &x,int &y){
18     if (!b) x=1,y=0;
19     else exgcd(b,a%b,y,x),y-=a/b*x;
20 }
21
22 int main(){
23     freopen("bzoj5334.in","r",stdin);
24     freopen("bzoj5334.out","w",stdout);
25     for (scanf("%d",&T); T--; ){
26         scanf("%d%d",&n,&mod); tot=0; res=1; frac(mod);
27         rep(i,1,10) s[i]=0;
28         rep(i,1,n){
29             scanf("%d",&op);
30             if (op==1){
31                 scanf("%d",&w);
32                 rep(j,0,tot) d[i][j]=0;
33                 rep(j,1,tot)
34                     while (w%p[j]==0) w/=p[j],d[i][j]++,s[j]++;
35                 int x,y; res=1ll*res*w%mod;
36                 exgcd(w,mod,x,y); d[i][0]=(x%mod+mod)%mod;
37                 int ans=res;
38                 rep(j,1,tot) rep(k,1,s[j]) ans=1ll*ans*p[j]%mod;
39                 printf("%d\n",ans);
40             }else{
41                 scanf("%d",&x); res=1ll*res*d[x][0]%mod;
42                 rep(j,1,tot) s[j]-=d[x][j];
43                 int ans=res;
44                 rep(j,1,tot) rep(k,1,s[j]) ans=1ll*ans*p[j]%mod;
45                 printf("%d\n",ans);
46             }
47         }
48     }
49     return 0;
50 }

View Code

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

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define ls (x<<1)
 4 #define rs (ls|1)
 5 #define lson ls,L,mid
 6 #define rson rs,mid+1,R
 7 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 8 using namespace std;
 9
10 const int N=100010;
11 int T,n,mod,x,op,tag[N<<2];
12 struct P{ int l,r,v; }p[N];
13
14 void push(int x){
15     tag[ls]=1ll*tag[ls]*tag[x]%mod;
16     tag[rs]=1ll*tag[rs]*tag[x]%mod;
17     tag[x]=1;
18 }
19
20 void build(int x,int L,int R){
21     tag[x]=1;
22     if (L==R) return;
23     int mid=(L+R)>>1;
24     build(lson); build(rson);
25 }
26
27 void ins(int x,int L,int R,int l,int r,int k){
28     if (L==l && r==R){ tag[x]=1ll*tag[x]*k%mod; return; }
29     int mid=(L+R)>>1;
30     if (r<=mid) ins(lson,l,r,k);
31     else if (l>mid) ins(rson,l,r,k);
32         else ins(lson,l,mid,k),ins(rson,mid+1,r,k);
33 }
34
35 int que(int x,int L,int R,int pos){
36     if (L==R) return tag[x];
37     int mid=(L+R)>>1; push(x);
38     if (pos<=mid) return que(lson,pos); else return que(rson,pos);
39 }
40
41 int main(){
42     for (scanf("%d",&T); T--; ){
43         scanf("%d%d",&n,&mod);
44         rep(i,1,n){
45             scanf("%d",&op);
46             if (op==1) scanf("%d",&x),p[i]=(P){i,n,x};
47                 else scanf("%d",&x),p[x].r=i-1,p[i].l=0;
48         }
49         build(1,1,n);
50         rep(i,1,n) if (p[i].l) ins(1,1,n,p[i].l,p[i].r,p[i].v);
51         rep(i,1,n) printf("%d\n",que(1,1,n,i));
52     }
53     return 0;
54 }

转载于:https://www.cnblogs.com/HocRiser/p/9919594.html

[BZOJ5334][TJOI2018]数学计算(exgcd/线段树)相关推荐

  1. bzoj5334 [Tjoi2018]数学计算(线段树)

    线段树维护一下即可. 删掉一个数就对应位置置1. #include <cstdio> #include <cstring> #include <algorithm> ...

  2. P4588 [TJOI2018]数学计算(线段树维护区间乘和单点修改)

    P4588 [TJOI2018]数学计算 刚看到这题根本每想到用线段树,直接每次记录计算结果然后找到要除的数字就好了呗 但是!你会注意到,如果连续乘很多很多次,然后再除的话,如果不取模会爆 long ...

  3. [TJOI2018]数学计算

    题目链接:[TJOI2018]数学计算 由于有mod非质数,所以不能直接逆元去做. 故我们可以按照时间轴建立线段树,利用线段树分治,然后输出全局的乘积即可. AC代码: #pragma GCC opt ...

  4. 【数据结构2-2】线段树与树状数组 题解

    头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...

  5. 2018.07.11 线段树基本模板复习

    白天听了一天的dpdp,晚上复习一下线段树的板子 //线段树维护区间增加(减少),区间最大值,区间最小值,区间和 #include<bits/stdc++.h>//宏命令替换常量和左右儿子 ...

  6. 杭电1166敌兵布阵(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. Gym-101466K Random Numbers(线段树,数学,唯一分解定理)

    给一棵树,树上每个节点有一个权值,有两个操作,RAND操作查询u的子树乘积是多少以及有多少因数,SEED操作把节点u乘上v n,q <= 1e5.数值小于等于1e9,最大的质因数不超过13 组队 ...

  8. 线段树分裂与合并的模板以及空间大小的计算

    学习知识来自AGOH的B站视频 银酱对线段树合并空间大小的计算 模板题 #include <bits/stdc++.h>using namespace std; typedef long ...

  9. POJ2528 计算可见线段(线段树)

    原题链接:POJ2528 解析:这题考察的是线段树子区间更新的维护中的计算可见线段. 用离散化,排序去重,但是这题广告是一块瓷砖一块瓷砖贴的,也就是说有可能离散化之后,明明俩个相邻点之前有空白,但是由 ...

  10. hdu 1394 线段树计算逆序数

    线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...

最新文章

  1. 机器学习笔记:梯度下降
  2. 在一个数组中删除另一个数组存在的值
  3. for循环中一个不容小觑的问题
  4. 配置树莓派linux的内核和编译并将镜像拷贝至树莓派
  5. linux mint 18支持安卓编译,Linux mint 18版本开启SSH服务
  6. matlab 图像二值化_推荐:为图像处理初学者设计的100个问题(含python实现代码)...
  7. 在场景中添加光线——给光线添加更高的细节:逐像素光照
  8. SQL73 考试分数(二)
  9. 从零学ELK系列(一):为什么要跟我学从零学ELK系列
  10. matlab zxing ean13,【zxing】Ean13 Contents do not pass checksum
  11. net472无法建立到信任_是否还会信任,那个曾经背叛过自己的人
  12. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...
  13. Scratch 3的作品(sb3格式的文件)怎么生成可执行exe文件
  14. 3D打印技术最全解析:从设计到工艺
  15. Git SSH 方式无法 push 踩坑
  16. yd什么意思_yd是什么意思是什么
  17. 卡在装备配置计算机,win10开机卡logo的小伙伴有福了,赶紧看过来!
  18. 《论语》全译——季氏篇第十六
  19. 基于 React hooks + Typescript + Cesium 实现地下模式预览
  20. EMQX数据持久化到mysql

热门文章

  1. Java数组去掉重复的方法集
  2. Spotlight监控Oracle--Spotlight On Oracle安装和使用
  3. CentOS 6.5忘记root密码,怎么办?
  4. 雀巢联手京东,发布人工智能家庭营养健康助手
  5. 通过利用“业务映射”来构建敏捷组织
  6. .NET IO 复习中的误区
  7. @objc private 定义函数
  8. CF985E Pencils and Boxes
  9. nodejs后台系列--第三篇-最简单的全栈demo:koa2+mysql+vue
  10. jbutton如何实现点击_点击量突破22.1亿人次!这场云上祈福拜祖是如何实现的