【BZOJ3813】奇数国

Description

给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值。每个数都可以表示成前60个质数的若干次方的乘积。

Sample Input

6
0 1 3
1 1 5
0 1 3
1 1 7
0 1 3
0 2 3

Sample Output

18
24
36
6

HINT

x≤100000,当ai=0时0≤ci−bi≤100000

题解:显然我们可以先求出区间乘积,然后判断一下每个质数是否在其中出现过即可,如果出现过,则ans*=(P-1)/P。

由于只有60个质数,所以用一个long long存起来就行,然后用线段树维护一下。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define lson x<<1
  5. #define rson x<<1|1
  6. using namespace std;
  7. typedef long long ll;
  8. const int maxn=100010;
  9. int n=100000,m,num;
  10. int pri[100],np[300];
  11. ll ine[100];
  12. const ll P=19961993;
  13. struct node
  14. {
  15. ll x,y;
  16. node() {}
  17. node(ll a,ll b) {x=a,y=b;}
  18. node operator + (const node &a) const {return node(x*a.x%P,y|a.y);}
  19. }s[maxn<<2];
  20. inline int rd()
  21. {
  22. int ret=0,f=1; char gc=getchar();
  23. while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
  24. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  25. return ret*f;
  26. }
  27. void build(int l,int r,int x)
  28. {
  29. if(l==r)
  30. {
  31. s[x]=node(3,2);
  32. return ;
  33. }
  34. int mid=(l+r)>>1;
  35. build(l,mid,lson),build(mid+1,r,rson);
  36. s[x]=s[lson]+s[rson];
  37. }
  38. void updata(int l,int r,int x,int a,ll b)
  39. {
  40. if(l==r)
  41. {
  42. s[x]=node(b,0);
  43. for(int i=1;i<=60;i++) if(b%pri[i]==0) s[x].y|=(1ll<<(i-1));
  44. return ;
  45. }
  46. int mid=(l+r)>>1;
  47. if(a<=mid) updata(l,mid,lson,a,b);
  48. else updata(mid+1,r,rson,a,b);
  49. s[x]=s[lson]+s[rson];
  50. }
  51. node query(int l,int r,int x,int a,int b)
  52. {
  53. if(a<=l&&r<=b) return s[x];
  54. int mid=(l+r)>>1;
  55. if(b<=mid) return query(l,mid,lson,a,b);
  56. if(a>mid) return query(mid+1,r,rson,a,b);
  57. return query(l,mid,lson,a,b)+query(mid+1,r,rson,a,b);
  58. }
  59. inline ll pm(ll x,ll y)
  60. {
  61. ll z=1;
  62. while(y)
  63. {
  64. if(y&1) z=z*x%P;
  65. x=x*x%P,y>>=1;
  66. }
  67. return z;
  68. }
  69. int main()
  70. {
  71. m=rd();
  72. int i,j,a,b,op;
  73. for(i=2;i<=281;i++)
  74. {
  75. if(!np[i]) pri[++num]=i,ine[num]=pm(i,P-2);
  76. for(j=1;j<=num&&i*pri[j]<=281;j++)
  77. {
  78. np[i*pri[j]]=1;
  79. if(i%pri[j]==0) break;
  80. }
  81. }
  82. build(1,n,1);
  83. for(i=1;i<=m;i++)
  84. {
  85. op=rd(),a=rd(),b=rd();
  86. if(!op)
  87. {
  88. node tmp=query(1,n,1,a,b);
  89. for(j=1;j<=60;j++) if((tmp.y>>(j-1))&1) tmp.x=tmp.x*ine[j]%P*(pri[j]-1)%P;
  90. printf("%lld\n",tmp.x);
  91. }
  92. else updata(1,n,1,a,b);
  93. }
  94. return 0;
  95. }//6 0 1 3 1 1 5 0 1 3 1 1 7 0 1 3 0 2 3

【BZOJ3813】奇数国 线段树+欧拉函数的更多相关文章

  1. [bzoj3813] 奇数国 [线段树+欧拉函数]

    题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...

  2. BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 755  Solved: 432[Submit][Status][Discuss] ...

  3. 【bzoj3813】: 奇数国 数论-线段树-欧拉函数

    [bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...

  4. [BZOJ3813] 奇数国 - 线段树

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 912  Solved: 508[Submit][Status][Discuss] ...

  5. Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)

    题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...

  6. 线段树+欧拉函数——cf1114F

    调了半天,写线段树老是写炸 /* 两个操作 1.区间乘法 2.区间乘积询问欧拉函数 欧拉函数计算公式 phi(mul(ai))=mul(ai) * (p1-1)/p1 * (p2-1)/p2 * .. ...

  7. Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)

    这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...

  8. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

  9. BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学

    Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...

随机推荐

  1. springmvc 数据回显功能

    按下 修改数据之后 修改功能实现-转向修改页面 2)控制层实现准备数据,并转向修改页面 ~ PersonController.java package cn.itcast.springmvc.cont ...

  2. oracle聚合函数及行专列,pivot rollup cube

    1.原始数据 --方法-: --以单位分组,计算每类特殊情况的合计以及按照单位的小计数 with a as (SELECT b.szfz, case  when tsqk is not null th ...

  3. Powershell - 获取OS版本信息和catpion信息

    Environment  获取 OSversion: $OSVersion = [System.Environment]::OSVersion.Version WMI获取Caption: $OSCap ...

  4. 最全面的 Sublime Text 使用指南

    最全面的 Sublime Text 使用指南   摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的Sublime Text中文教程. 前言(Prologue) ...

  5. 【JAVA设计模式】外观模式(Facade Pattern)

    一  定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二  案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...

  6. Swift中UIView类方法(animateWithDuration)的使用

    需求:利用Swift语言实现OC语言中UIView类方法 [UIView animateWithDuration:0.5 animations:^{ bgView.alpha= 1; }]; 在Swi ...

  7. C++语言基础(21)-异常

    C++语言本身或者标准库抛出的异常都是 exception 的子类,称为标准异常(Standard Exception).你可以通过下面的语句来捕获所有的标准异常: try{ //可能抛出异常的语句 ...

  8. PHP学习笔记(1)数组函数

    1.数组的键值操作函数: $arr = array("小明" => 98, "小红" => 76, "小黑" => 66, ...

  9. 初识md5碰撞与crc32碰撞

    现在是晚上23:29.写这篇文章呢,是因为早些时候我胃疼,是因为凉导致的胃疼.凉呢喝了一些热水,喝完热水胃倒是不疼了,但是由于我喝的是茶叶开水,于是就导致失眠了.想来想去这漫漫长夜也没意思,于是就决定 ...

  10. web.py使用要点

    这几天有一个构建restful services的需求,我采用了web.py,之前并没有使用过,但在使用中确实给我带来了很多惊喜.当然,最大的惊喜就是简单,方便.之前开发restful服务的时候,采用 ...