题目描述

  给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\)。每个数的质因子都只有前\(60\)个质数。有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i=l}^ra_i)\)

  模数为\(19961993\),是个质数

  \(n=100000,q\leq 100000\)

题解

  水题

\[\phi(x)=x\prod_{p_i|x}(1-\frac1{p_i})
\]

  用线段树维护区间乘积和这个区间的乘积的质因子(每个质数有没有出现)

  然后乱搞

  时间复杂度:\(O(q\log n)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<ctime>
  6. #include<cstdlib>
  7. #include<utility>
  8. using namespace std;
  9. typedef long long ll;
  10. typedef pair<int,int> pii;
  11. typedef pair<ll,ll> pll;
  12. ll p=19961993;
  13. ll pp=p;
  14. ll fp(ll a,ll b)
  15. {
  16. ll s=1;
  17. while(b)
  18. {
  19. if(b&1)
  20. s=s*a%p;
  21. a=a*a%p;
  22. b>>=1;
  23. }
  24. return s;
  25. }
  26. int pri[110];
  27. ll a[110];
  28. ll s[500010];
  29. ll o[500010];
  30. int ls(int x){return x*2;}
  31. int rs(int x){return x*2+1;}
  32. void build(int p=1,int l=1,int r=100000)
  33. {
  34. if(l==r)
  35. {
  36. s[p]=3;
  37. o[p]=2;
  38. return;
  39. }
  40. int mid=(l+r)>>1;
  41. build(ls(p),l,mid);
  42. build(rs(p),mid+1,r);
  43. s[p]=s[ls(p)]*s[rs(p)]%pp;
  44. o[p]=o[ls(p)]|o[rs(p)];
  45. }
  46. void change(int p,int x,ll v1,ll v2,int L=1,int R=100000)
  47. {
  48. if(L==R)
  49. {
  50. s[p]=v1;
  51. o[p]=v2;
  52. return;
  53. }
  54. int mid=(L+R)>>1;
  55. if(x<=mid)
  56. change(ls(p),x,v1,v2,L,mid);
  57. else
  58. change(rs(p),x,v1,v2,mid+1,R);
  59. s[p]=s[ls(p)]*s[rs(p)]%pp;
  60. o[p]=o[ls(p)]|o[rs(p)];
  61. }
  62. pll query(int p,int l,int r,int L=1,int R=100000)
  63. {
  64. if(l<=L&&r>=R)
  65. return pll(s[p],o[p]);
  66. int mid=(L+R)>>1;
  67. pll s(1,0);
  68. if(l<=mid)
  69. {
  70. pll s1=query(ls(p),l,r,L,mid);
  71. s.first=s.first*s1.first%pp;
  72. s.second|=s1.second;
  73. }
  74. if(r>mid)
  75. {
  76. pll s2=query(rs(p),l,r,mid+1,R);
  77. s.first=s.first*s2.first%pp;
  78. s.second|=s2.second;
  79. }
  80. return s;
  81. }
  82. int main()
  83. {
  84. freopen("d1t3.in","r",stdin);
  85. freopen("d1t3.out","w",stdout);
  86. build();
  87. int n;
  88. scanf("%d",&n);
  89. int i,j;
  90. int cnt=0;
  91. for(i=2;i<=281;i++)
  92. {
  93. for(j=2;j<i;j++)
  94. if(i%j==0)
  95. break;
  96. if(j>=i)
  97. {
  98. pri[++cnt]=i;
  99. a[cnt]=(i-1)*fp(i,p-2)%p;
  100. }
  101. }
  102. int x,y,z;
  103. for(i=1;i<=n;i++)
  104. {
  105. scanf("%d%d%d",&x,&y,&z);
  106. if(x)
  107. {
  108. ll v=0;
  109. for(j=1;j<=cnt;j++)
  110. if(z%pri[j]==0)
  111. v|=1ll<<(j-1);
  112. change(1,y,z,v);
  113. }
  114. else
  115. {
  116. pll s=query(1,y,z);
  117. ll ans=s.first;
  118. for(j=1;j<=60;j++)
  119. if(s.second&(1ll<<(j-1)))
  120. ans=ans*a[j]%p;
  121. printf("%lld\n",ans);
  122. }
  123. }
  124. return 0;
  125. }

【BZOJ3813】【清华集训2014】奇数国 线段树 数学的更多相关文章

  1. UOJ46. 【清华集训2014】玄学 [线段树,二进制分组]

    UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\) ...

  2. UOJ46 清华集训2014玄学(线段树)

    注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见 ...

  3. 【数论&线段树】【P4140】[清华集训2015]奇数国

    Description 有一个长为 \(n\) 的序列,保证序列元素不超过 \(10^6\) 且其质因数集是前60个质数集合的子集.初始时全部都是 \(3\),有 \(m\) 次操作,要么要求支持单点 ...

  4. 【BZOJ3813】奇数国 线段树+欧拉函数

    [BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...

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

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

  6. 【bzoj3813】奇数国 线段树

    题目描述 给出一个长度为n的序列,每个数都可以由前60个质数的乘积表示,初始每个数都是3.支持两种操作:(1)修改一个数 (2)查询一段区间内所有数的乘积的欧拉函数值模19961993. 输入 第一行 ...

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

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

  8. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  9. LOJ 164 【清华集训2015】V——线段树维护历史最值

    题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...

随机推荐

  1. python2.x版本与python3.x版本的区别以及运算符

    python2.x中: 重复代码,语言不统一,不支持中文 py2中除法获取的都是整形 py2中有long(长整形) print 可以加括号也可以不加括号 range 在py2中打印的结果是列表 py2 ...

  2. 01 Django REST Framework 介绍

    01-Django REST Framework的介绍 Django REST框架是一个用于构建Web API的强大而灵活的工具包. 您可能希望使用REST框架的一些原因: 1. Web可浏览API对 ...

  3. OO博客作业4:第13-14周作业总结

    一.论述测试与正确性论证的效果差异,比较其优缺点 测试是设计若干组测试用例,运行程序并检验其是否完成预期功能.测试是一种直接发现BUG的方法,可以准确断定什么样的BUG会发生,并通过辅助调试进一步确定 ...

  4. SQL SERVER中的两种常见死锁及解决思路

    在sql server中,死锁都与一种锁有关,那就是排它锁(x锁).由于在同一时间对同一个数据库资源只能有一个数据库进程可以拥有排它锁.因此,一旦多个进程都需要获取某个或者同一个数据库资源的排它访问权 ...

  5. (第十三周)评论Final发布I

    本人所在组:奋斗吧兄弟 按课上展示的顺序对每组进行点评: 1.  Nice 项目:约跑软件 展示的时候使用了摄像头投影,提高了演示效果,软件的背景进行了美化,表现好了很好.解决了我们组提出的文字多挤没 ...

  6. linux中mariadb的安装

    在Linux中mariaDB的安装 MariaDB其实就是MySQL的分支,是为了应对MySQL的即将的闭源风险所产生的. Linux系统中软件包的格式为mysql.rpm格式. 通过yum去安装 L ...

  7. Python之字符串格式化

    1)     占位符%s: %s是通用的占位符,所有类型不管是string还是int还是float全都代表. 如果使用%d,则只能代表整数:如果是%f,则只能代表小数: 2)     直接用加号+连接 ...

  8. from、where、group、with、having、order、union、limit 的使用

    顺序很重要 每次看数据库的一些语法时,都很自然的略过那一大堆的规则,比如说线下面这段select的语法: select [field1,field2...] func_namefrom table1, ...

  9. oracle导出用户下单表或者多表,导入到别的服务器用户下

      导出   exp 用户名/密码 file=存放dmp的名称的目录 statistics=none tables =(表名,表名,表名) exp creditfw/credit file=d:\te ...

  10. h5-语义化标签

    ###1.语义化标签 在h5之前,在开发过程中大量div的id名称重复,例如div id="footer"来标记页脚内容,所以html5元素引入了语义化标签(一组新的片段类元素)  ...