题目

数据范围

分析

时限5000ms。

我们注意到\(a_{i}初始值以及x小于等于600且非零\)

也就是说,\(a_{i}\)的质因数一定小于600,而600以内的质因数只有109个。

那么考虑常用于区间修改的线段树。

用线段树来维护某个位置的某个质因数的总乘积,以及某个质因数出现的位置的个数。

时间复杂度\(O(QlogN·109)\)

  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <queue>
  8. const long long maxlongint=2147483647;
  9. const long long mo=100000007;
  10. const long long N=50005;
  11. using namespace std;
  12. struct ddx
  13. {
  14. long long a[120],v[120],lazy[120],sum[120];
  15. }tree[50005];
  16. long long ss[80000],n,m,ny[1000005],belong[1000005];
  17. long long ans,re[10005];
  18. bool b[1000005];
  19. long long mi(long long x,long long y)
  20. {
  21. long long sum=1;
  22. while(y)
  23. {
  24. if(y&1) sum=x*sum%mo;
  25. x=x*x%mo;
  26. y/=2;
  27. }
  28. return sum;
  29. }
  30. long long put(long long v,long long l,long long r,long long x,long long y,long long z)
  31. {
  32. if(l==r)
  33. {
  34. tree[v].a[y]=z;
  35. tree[v].v[y]=tree[v].v[y]*mi(ss[y],z)%mo;
  36. tree[v].sum[y]=1;
  37. return 0;
  38. }
  39. long long mid=(l+r)/2;
  40. if(x<=mid)
  41. put(v*2,l,mid,x,y,z);
  42. else put(v*2+1,mid+1,r,x,y,z);
  43. for(long long i=1;i<=109;i++)
  44. {
  45. tree[v].a[i]=(tree[v*2].a[i]+tree[v*2+1].a[i])%mo;
  46. tree[v].v[i]=tree[v*2].v[i]*tree[v*2+1].v[i]%mo;
  47. tree[v].sum[i]=tree[v*2].sum[i]+tree[v*2+1].sum[i];
  48. }
  49. }
  50. long long down(long long v,long long mid,long long l,long long r,long long y)
  51. {
  52. if(!tree[v].lazy[y]) return 0;
  53. long long z=tree[v].lazy[y];
  54. tree[v*2].a[y]+=z*(mid-l+1);
  55. tree[v*2+1].a[y]+=z*(r-mid);
  56. tree[v*2].v[y]=tree[v*2].v[y]*mi(ss[y],z*(mid-l+1))%mo;
  57. tree[v*2+1].v[y]=tree[v*2+1].v[y]*mi(ss[y],z*(r-mid))%mo;
  58. tree[v*2].lazy[y]+=z;
  59. tree[v*2+1].lazy[y]+=z;
  60. tree[v*2].sum[y]=(mid-l+1);
  61. tree[v*2+1].sum[y]=(r-mid);
  62. tree[v].lazy[y]=0;
  63. }
  64. long long change(long long v,long long l,long long r,long long x,long long x1,long long y,long long z)
  65. {
  66. if(l==x && r==x1)
  67. {
  68. tree[v].a[y]=(tree[v].a[y]+z*(r-l+1))%mo;
  69. tree[v].v[y]=tree[v].v[y]*mi(ss[y],z*(r-l+1))%mo;
  70. tree[v].sum[y]=(r-l+1);
  71. tree[v].lazy[y]+=z;
  72. return 0;
  73. }
  74. long long mid=(l+r)/2;
  75. for(long long i=1;i<=109;i++) down(v,mid,l,r,i);
  76. if(x1<=mid)
  77. change(v*2,l,mid,x,x1,y,z);
  78. else
  79. if(x>mid)
  80. change(v*2+1,mid+1,r,x,x1,y,z);
  81. else
  82. change(v*2,l,mid,x,mid,y,z),change(v*2+1,mid+1,r,mid+1,x1,y,z);
  83. for(long long i=1;i<=109;i++)
  84. {
  85. tree[v].a[i]=(tree[v*2].a[i]+tree[v*2+1].a[i])%mo;
  86. tree[v].v[i]=tree[v*2].v[i]*tree[v*2+1].v[i]%mo;
  87. tree[v].sum[i]=tree[v*2].sum[i]+tree[v*2+1].sum[i];
  88. }
  89. }
  90. long long find(long long v,long long l,long long r,long long x,long long x1)
  91. {
  92. if(l==x && r==x1)
  93. {
  94. for(long long i=1;i<=109;i++)
  95. {
  96. if(tree[v].sum[i])
  97. ans=ans*tree[v].v[i]%mo*mi(ny[ss[i]],tree[v].sum[i])%mo*mi(ss[i]-1,tree[v].sum[i])%mo;
  98. }
  99. return 0;
  100. }
  101. long long mid=(l+r)/2;
  102. for(long long i=1;i<=109;i++) down(v,mid,l,r,i);
  103. if(x1<=mid)
  104. find(v*2,l,mid,x,x1);
  105. else
  106. if(x>mid)
  107. find(v*2+1,mid+1,r,x,x1);
  108. else
  109. find(v*2,l,mid,x,mid),find(v*2+1,mid+1,r,mid+1,x1);
  110. for(long long i=1;i<=109;i++)
  111. {
  112. tree[v].a[i]=(tree[v*2].a[i]+tree[v*2+1].a[i])%mo;
  113. tree[v].v[i]=tree[v*2].v[i]*tree[v*2+1].v[i]%mo;
  114. tree[v].sum[i]=tree[v*2].sum[i]+tree[v*2+1].sum[i];
  115. }
  116. }
  117. int main()
  118. {
  119. memset(b,true,sizeof(b));
  120. b[0]=0;
  121. b[1]=0;
  122. for(long long i=2;i<=10000;i++)
  123. {
  124. if(b[i])
  125. {
  126. ss[++ss[0]]=i;
  127. ny[i]=mi(i,mo-2);
  128. belong[i]=ss[0];
  129. }
  130. for(long long j=1;j<=ss[0];j++)
  131. {
  132. if(i*ss[j]<=10000)
  133. b[i*ss[j]]=false;
  134. else break;
  135. if(!(i%ss[j])) break;
  136. }
  137. }
  138. scanf("%lld",&n);
  139. for(long long i=1;i<=50001;i++)
  140. for(long long j=1;j<=110;j++)
  141. tree[i].v[j]=1;
  142. for(long long j=1;j<=n;j++)
  143. {
  144. scanf("%lld",&re[j]);
  145. long long p=re[j];
  146. if(b[p])
  147. {
  148. put(1,1,n,j,belong[p],1);
  149. }
  150. else
  151. {
  152. for(long long k=1;ss[k]<=sqrt(re[j]) && p>1;k++)
  153. {
  154. long long w=0;
  155. while(!(p%ss[k]))
  156. {
  157. p/=ss[k];
  158. w++;
  159. }
  160. if(w)
  161. {
  162. put(1,1,n,j,k,w);
  163. }
  164. }
  165. if(p>1)
  166. {
  167. put(1,1,n,j,belong[p],1);
  168. }
  169. }
  170. }
  171. long long q;
  172. scanf("%lld",&q);
  173. for(long long i=1;i<=q;i++)
  174. {
  175. long long t,x,y,z;
  176. scanf("%lld%lld%lld",&t,&x,&y);
  177. if(t)
  178. {
  179. ans=1;
  180. find(1,1,n,x,y);
  181. printf("%lld\n",ans);
  182. }
  183. else
  184. {
  185. scanf("%lld",&z);
  186. long long p=z;
  187. if(b[p])
  188. {
  189. change(1,1,n,x,y,belong[p],1);
  190. }
  191. else
  192. {
  193. for(long long k=1;ss[k]<=sqrt(z) && p>1;k++)
  194. {
  195. long long w=0;
  196. while(!(p%ss[k]))
  197. {
  198. p/=ss[k];
  199. w++;
  200. }
  201. if(w)
  202. {
  203. change(1,1,n,x,y,k,w);
  204. }
  205. }
  206. if(p>1)
  207. {
  208. change(1,1,n,x,y,belong[p],1);
  209. }
  210. }
  211. }
  212. }
  213. }

【NOIP2016提高组A组7.16】第三条跑道的更多相关文章

  1. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  2. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  3. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  4. 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)

    5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms   ...

  5. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  6. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  7. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  8. iOS之UITableView组头组尾视图/标题悬停

    最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...

  9. iOS自定义组与组之间的距离以及视图

    iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...

随机推荐

  1. mysql explain中的列

    参考:<高性能mysql>附录D EXPLAIN MySql将Select查询分为简单和复杂类型,复杂类型分为3大类:简单子查询,所谓的派生表(在派生表的子查询),以及UNION查询. 列 ...

  2. windows 使用Docker Desktop 使用国内镜像

    ===新增一些比较给力的镜像=== 1.中科大镜像加速地址 https://docker.mirrors.ustc.edu.cn 2.阿里云镜像服务 ========= 原本在配置项中添加了:国内镜像 ...

  3. python基础:multiprocessing的使用

    不同于C++或Java的多线程,python中是使用多进程来解决多项任务并发以提高效率的问题,依靠的是充分使用多核CPU的资源.这里是介绍mulitiprocessing的官方文档:https://d ...

  4. 操作系统(3)实验相关原理——bootloader启动uCore

    x86启动顺序 CS+EIP决定启动地址. CS部分后面又4个0,相当于是左移了4位.总之就是要让CS左移4位之后加上EIP来得到要跳转的地址. 0x7c00地方开始的512字节的内容就是bootlo ...

  5. MSSQL注入--反弹注入

    明明是sql注入的点,却无法进行注入,注射工具拆解的速度异常的缓慢,错误提示信息关闭,无法返回注入的结果,这个时候你便可以尝试使用反弹注入, 反弹注入需要依赖于函数opendatasource的支持, ...

  6. python 并发编程 多进程 Process对象的其他属性方法 terminate与is_alive name pid 函数

    进程对象的其他方法一: terminate与is_alive is_alive()  立刻查看的子进程结果 是否存活 from multiprocessing import Process impor ...

  7. [DS+Algo] 006 两种简单排序及其代码实现

    目录 1. 快速排序 QuickSort 1.1 步骤 1.2 性能分析 1.3 Python 代码示例 2. 归并排序 MergeSort 2.1 步骤 2.2 性能分析 2.3 Python 代码 ...

  8. Coding 地址

    Coding 连接 https://dev.tencent.com/u/leexi

  9. HNCPC2019H 有向图

    题目 设\(f_i\)表示经过\(i\)的期望次数.那么显然答案\(ans_j=\sum\limits_{i=1}^nf_iP_{i,j}\). 我们可以轻松地列出转移式子: \[ f_1=\sum\ ...

  10. loli的测试-2018.12.9

    模拟赛-2018.12.9 这是NOIP之后第一次模拟赛...但是考的比较悲惨. 非常喜欢写考试总结,不知道为什么... T1:https://www.luogu.org/problemnew/sho ...