模意义下除法若结果仍为整数的话,可以记录模数的所有质因子,计算这些质因子的次幂数,剩余的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=;
  7. int T,n,mod,op,w,tot,res,x,d[N][],p[],s[];
  8.  
  9. void frac(int n){
  10. for (int i=; i*i<=n; i++) if (n%i==){
  11. p[++tot]=i;
  12. while (n%i==) n/=i;
  13. }
  14. if (n>) p[++tot]=n;
  15. }
  16.  
  17. void exgcd(int a,int b,int &x,int &y){
  18. if (!b) x=,y=;
  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=; res=; frac(mod);
  27. rep(i,,) s[i]=;
  28. rep(i,,n){
  29. scanf("%d",&op);
  30. if (op==){
  31. scanf("%d",&w);
  32. rep(j,,tot) d[i][j]=;
  33. rep(j,,tot)
  34. while (w%p[j]==) 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][]=(x%mod+mod)%mod;
  37. int ans=res;
  38. rep(j,,tot) rep(k,,s[j]) ans=1ll*ans*p[j]%mod;
  39. printf("%d\n",ans);
  40. }else{
  41. scanf("%d",&x); res=1ll*res*d[x][]%mod;
  42. rep(j,,tot) s[j]-=d[x][j];
  43. int ans=res;
  44. rep(j,,tot) rep(k,,s[j]) ans=1ll*ans*p[j]%mod;
  45. printf("%d\n",ans);
  46. }
  47. }
  48. }
  49. return ;
  50. }

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

  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=;
  11. int T,n,mod,x,op,tag[N<<];
  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]=;
  18. }
  19.  
  20. void build(int x,int L,int R){
  21. tag[x]=;
  22. if (L==R) return;
  23. int mid=(L+R)>>;
  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)>>;
  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+,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)>>; 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,,n){
  45. scanf("%d",&op);
  46. if (op==) scanf("%d",&x),p[i]=(P){i,n,x};
  47. else scanf("%d",&x),p[x].r=i-,p[i].l=;
  48. }
  49. build(,,n);
  50. rep(i,,n) if (p[i].l) ins(,,n,p[i].l,p[i].r,p[i].v);
  51. rep(i,,n) printf("%d\n",que(,,n,i));
  52. }
  53. return ;
  54. }

[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. 持续集成工具Jenkins安装、部署、使用

    本文介绍jenkins,利用其做项目发布与持续集成交付工具. 一.Jenkins是什么? Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布 ...

  2. CodeForces - 1004B

    Sonya decided to organize an exhibition of flowers. Since the girl likes only roses and lilies, she ...

  3. HDU 1999 不可摸数 (模拟)

    题目链接 Problem Description s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数 ...

  4. centos6.5 导入matplotlib报错 No module named '_tkinter

    1.解决方案 在centos系统下,导入matplotlib时,出现ImportError: No module named ‘_tkinter’的错误,首先 yum list installed | ...

  5. PHP提取url

    <?php $str = parse_url('http://localhost/?id=2&cd=2', PHP_URL_QUERY); ECHO $str; parse_str($s ...

  6. 76.ZYNQ-用PS控制DDR3内存读写

    本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧. 本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验 ...

  7. Keras自定义评估函数

    1. 比较一般的自定义函数: 需要注意的是,不能像sklearn那样直接定义,因为这里的y_true和y_pred是张量,不是numpy数组.示例如下: from keras import backe ...

  8. openjudge-NOI 2.6-1944 吃糖果

    题目链接:http://noi.openjudge.cn/ch0206/1944/ 题解: 递推,题目中给出了很详细的过程,不讲解 #include<cstdio> int n; int ...

  9. C/C++——C语言常用库函数

    本文转载自:https://blog.csdn.net/qq_36955347/article/details/71511900 一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #inc ...

  10. JavaScript 去字符串空格

    JavaScript 去字符串空格 (利用正则) # str为要去除空格的字符串: # 去除所有空格: str = str.replace(/\s+/g,""); # 去除两头空格 ...