Description

  小 B 有一个很大的数 S,长度达到了 N 位;这个数可以看成是一个串,它可能有前导 0,例如00009312345
。小B还有一个素数P。现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也
是P 的倍数)。例如 S为0077时,其子串 007有6个子串:0,0,7,00,07,007;显然0077的子串007有6个子串都是素
数7的倍数。

Input

  第一行一个整数:P。第二行一个串:S。第三行一个整数:M。接下来M行,每行两个整数 fr,to,表示对S 的
子串S[fr…to]的一次询问。注意:S的最左端的数字的位置序号为 1;例如S为213567,则S[1]为 2,S[1…3]为 2
13。N,M<=100000,P为素数

Output

  输出M行,每行一个整数,第 i行是第 i个询问的答案。

可以考虑用莫队解决区间询问
对于p!=2且p!=5,预处理串的每个后缀mod p的值,若两后缀mod p相等则它们间的一段mod p=0
若p=2或5,则一个串mod p为0当且仅当末尾能被p整除
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cmath>
  5. typedef long long lint;
  6. lint Ans=;
  7. int m;
  8. char s[];
  9. struct Q{
  10. int l,r,id;
  11. }q[];
  12. lint ans[];
  13. int b,l,p;
  14. int mp[],id[];
  15. inline bool operator<(const Q&a,const Q&b){
  16. if(id[a.l]!=id[b.l])return id[a.l]<id[b.l];
  17. return (a.r<b.r)!=(id[a.l]&);
  18. }
  19. namespace map{
  20. const int P=;
  21. lint xs[P];
  22. int ys[P],now=;
  23. bool d[P];
  24. int get(lint x){
  25. int w=x%P;
  26. while(d[w]){
  27. if(xs[w]==x)return ys[w];
  28. w+=;
  29. if(w>=P)w-=P;
  30. }
  31. d[w]=;xs[w]=x;
  32. return ys[w]=now++;
  33. }
  34. }
  35. int yv[];
  36. inline void inc(int x){
  37. Ans+=yv[x]++;
  38. }
  39. inline void dec(int x){
  40. Ans-=--yv[x];
  41. }
  42. int main(){
  43. scanf("%d%s%d",&p,s+,&m);
  44. l=strlen(s+);
  45. b=double(l+)/(sqrt(m+)+)+;
  46. for(int i=;i<=l;i++)id[i]=(i-)/b;
  47. for(int i=;i<m;i++){
  48. scanf("%d%d",&q[i].l,&q[i].r);
  49. q[i].id=i;
  50. }
  51. std::sort(q,q+m);
  52. int p10=;
  53. if(p!=&&p!=){
  54. for(int i=l;i;i--){
  55. mp[i]=(mp[i+]+(s[i]-48ll)*p10)%p;
  56. p10=p10*10ll%p;
  57. }
  58. for(int i=;i<=l+;i++)mp[i]=map::get(mp[i]);
  59. }else for(int i=;i<=l;i++)mp[i]=(s[i]-)%p;
  60. int L=,R=;
  61. if(p!=&&p!=)
  62. for(int i=;i<m;i++){
  63. int l=q[i].l,r=q[i].r+;
  64. while(L<l)dec(mp[L++]);
  65. while(L>l)inc(mp[--L]);
  66. while(R<r)inc(mp[++R]);
  67. while(R>r)dec(mp[R--]);
  68. ans[q[i].id]=Ans;
  69. }else for(int i=,c=;i<m;i++){
  70. int l=q[i].l,r=q[i].r;
  71. while(L<l){
  72. Ans-=c;
  73. if(!mp[L++])--c;
  74. }
  75. while(L>l){
  76. if(!mp[--L])++c;
  77. Ans+=c;
  78. }
  79. while(R<r){
  80. if(!mp[++R])++c,Ans+=R-L+;
  81. }
  82. while(R>r){
  83. if(!mp[R--])Ans-=R-L+,--c;
  84. }
  85. ans[q[i].id]=Ans;
  86. }
  87. for(int i=;i<m;i++)printf("%lld\n",ans[i]);
  88. return ;
  89. }

bzoj4542 大数的更多相关文章

  1. 【BZOJ4542】[Hnoi2016]大数 莫队

    [BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...

  2. HNOI2016(BZOJ4542) 大数

    HNOI2016 Day2 T3 大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P ...

  3. 【bzoj4542】 Hnoi2016—大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...

  4. BZOJ4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  5. [BZOJ4542] [Hnoi2016] 大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  6. bzoj4542: [Hnoi2016]大数(莫队)

    这题...离散化...$N$和$n$搞错了...查了$2h$...QAQ 考虑$s[l...r]$,可以由两个后缀$suf[l]-suf[r+1]$得到$s[l...r]$代表的数乘$10^k$得到的 ...

  7. 【bzoj4542】[Hnoi2016]大数 莫队算法

    题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...

  8. [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)

    正经题解在最下面 http://blog.csdn.net/qq_32739495/article/details/51286548 写的时候看了大神的题解[就是上面那个网址],看到下面这段话 观察题 ...

  9. 【BZOJ4542】大数(莫队)

    题意:给定一个N位的由[0..9]组成的数字串和质数P,有M次不强制在线的询问,每次询问区间[l,r]中模P意义下为0的子串个数 N,M<=2e5,P<=1e10 思路:一次A,本来还以为 ...

随机推荐

  1. jquery获取服务器控件Label的值

    首先引入js文件:<script type="text/javascript" src="js/jquery-1.8.3.js"></scri ...

  2. 农历03__ZC

    代码,改自 农历01(http://www.cnblogs.com/cppskill/p/5930558.html) 1.main.cpp #include "Lunar_ZC.h" ...

  3. Spring MVC文件上传教程 commons-io/commons-uploadfile

    Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...

  4. PHP:第五章——字符串加密及校验函数

    <?php header("Content-Type:text/html;charset=utf-8"); //1.md5——计算字符中的散列值 //对一段信息(Messag ...

  5. MongoDB驱动程序快速入门

    http://mongodb.github.io/mongo-java-driver/3.6/driver/getting-started/quick-start/

  6. 知名第三方编译版tete009 Firefox 24.0

    Firefox除了官方版本上还有许多由爱好者自己编译修改的第三方版本. 其中 tete009 是十分流行的一个版本,目前tete009 Firefox 24.0 版本发布. tete009版Firef ...

  7. Ubuntu网络配置IP和DNS等,适用于14.04,16.04和17.10

    本文主要介绍Ubuntu系统的网络设置,包括IP,DNS和主机名等,适用于14.04,16.04和17.10等版本 ===============  完美的分割线 ================ = ...

  8. 中国的 Python 量化交易工具链有哪些

    摘抄自知乎:https://www.zhihu.com/question/28557233 如题,提问的范围限于适合中国大陆金融市场使用的工具链,所以IbPy和Quotopian之类主要面向欧美市场的 ...

  9. query更多的筛选用法

    比较操作符$eq : =  写法:db.class0.find({age:{$eq:18}},{name:1,_id:0}); 查找年龄等于18$lt :<$lte : <=$gt : & ...

  10. BZOJ3033: 太鼓达人(欧拉回路)

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Solved: 400[Submit][Status][Discuss] Description ...