题目

题解##

除了\(5\)和\(2\)

后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数

只用对区间种相同数个数\(x\)贡献\({x \choose 2}\)

经典莫队题

\(P = 2\)或\(5\)就特判一下

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define LL long long int
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
  10. using namespace std;
  11. const int maxn = 100005,maxm = 100005,INF = 1000000000;
  12. LL n,m,P,B;
  13. char s[maxn];
  14. LL ans[maxn];
  15. struct Que{int l,r,b,id;}q[maxn];
  16. inline bool operator <(const Que& a,const Que& b){
  17. return a.b == b.b ? a.r < b.r : a.l < b.l;
  18. }
  19. void solve1(){
  20. scanf("%lld",&m);
  21. REP(i,m) scanf("%d%d",&q[i].l,&q[i].r),q[i].id = i,q[i].b = q[i].l / B;
  22. sort(q + 1,q + 1 + m);
  23. LL L = q[1].l,R = q[1].r; LL cnt = 0,sum = 0;
  24. for (int i = L; i <= R; i++){
  25. if ((s[i] - '0') % P == 0) cnt++,sum += i - L + 1;
  26. }
  27. ans[q[1].id] = sum;
  28. for (int i = 2; i <= m; i++){
  29. while (L != q[i].l || R != q[i].r){
  30. if (L < q[i].l){
  31. sum -= cnt;
  32. if ((s[L] - '0') % P == 0) cnt--;
  33. L++;
  34. }
  35. if (L > q[i].l){
  36. L--;
  37. if ((s[L] - '0') % P == 0) cnt++;
  38. sum += cnt;
  39. }
  40. if (R < q[i].r){
  41. R++;
  42. if ((s[R] - '0') % P == 0) cnt++,sum += R - L + 1;
  43. }
  44. if (R > q[i].r){
  45. if ((s[R] - '0') % P == 0) cnt--,sum -= R - L + 1;
  46. R--;
  47. }
  48. }
  49. ans[q[i].id] = sum;
  50. }
  51. REP(i,m) printf("%lld\n",ans[i]);
  52. }
  53. int b[maxn],bi,a[maxn],tot,bac[maxn];
  54. int getn(int x){return lower_bound(b + 1,b + 1 + tot,x) - b;}
  55. LL C(LL x){
  56. if (x <= 1) return 0;
  57. return x * (x - 1) / 2;
  58. }
  59. void solve2(){
  60. for (int i = n,bin = 1; i; i--,bin = bin * 10 % P){
  61. b[i] = a[i] = ((s[i] - '0') * bin % P + a[i + 1]) % P;
  62. }
  63. n++;
  64. sort(b + 1,b + 1 + n); tot = 1;
  65. for (int i = 2; i <= n; i++) if (b[i] != b[tot]) b[++tot] = b[i];
  66. for (int i = 1; i <= n; i++) a[i] = getn(a[i]);
  67. scanf("%lld",&m);
  68. REP(i,m){
  69. scanf("%d%d",&q[i].l,&q[i].r); q[i].r++;
  70. q[i].id = i,q[i].b = q[i].l / B;
  71. }
  72. sort(q + 1,q + 1 + m);
  73. LL L = q[1].l,R = q[1].r; LL sum = 0;
  74. for (int i = L; i <= R; i++){
  75. sum -= C(bac[a[i]]);
  76. sum += C(++bac[a[i]]);
  77. }
  78. ans[q[1].id] = sum;
  79. for (int i = 2; i <= m; i++){
  80. while (L != q[i].l || R != q[i].r){
  81. if (L < q[i].l){
  82. sum -= C(bac[a[L]]);
  83. sum += C(--bac[a[L]]);
  84. L++;
  85. }
  86. if (L > q[i].l){
  87. L--;
  88. sum -= C(bac[a[L]]);
  89. sum += C(++bac[a[L]]);
  90. }
  91. if (R < q[i].r){
  92. R++;
  93. sum -= C(bac[a[R]]);
  94. sum += C(++bac[a[R]]);
  95. }
  96. if (R > q[i].r){
  97. sum -= C(bac[a[R]]);
  98. sum += C(--bac[a[R]]);
  99. R--;
  100. }
  101. }
  102. ans[q[i].id] = sum;
  103. }
  104. REP(i,m) printf("%lld\n",ans[i]);
  105. }
  106. int main(){
  107. scanf("%lld%s",&P,s + 1);
  108. n = strlen(s + 1); B = (int)sqrt(n) + 1;
  109. if (P == 2 || P == 5) solve1();
  110. else solve2();
  111. return 0;
  112. }

洛谷P3245 [HNOI2016]大数 【莫队】的更多相关文章

  1. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

  2. 洛谷P3246 [HNOI2016]序列 [莫队]

    传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...

  3. BZOJ.4542.[HNOI2016]大数(莫队)

    题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...

  4. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...

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

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

  6. 洛谷 P4396 (离散化+莫队+树状数组)

    ### 洛谷P4396  题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...

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

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

  8. 洛谷P4396 作业 [AHOI2013] 莫队

    正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...

  9. 洛谷 P2056 采花 - 莫队算法

    萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以 ...

随机推荐

  1. Mybatis generator(复制粘贴完成)

    命令行模式 1.java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml 2.Maven plugin(my ...

  2. Java控制语句例题,for循环语句,if条件语句等,Scanner类与Random类,Math.max()方法

    例题:编写程序,生成5个1至10之间的随机整数,并打印结果到控制台 import java.util.Random;class demo09 { public static void main(Str ...

  3. C# checked运算符

    一.C# checked运算符 checked运算符用于对整型算术运算和显式转换启用溢出检查. 默认情况下,表达式产生的值如果超出了目标类型的范围,将会产生两种情况: ?常数表达式将导致编译时错误. ...

  4. C#的接口基础教程之三 定义接口成员

    接口可以包含一个和多个成员,这些成员可以是方法.属性.索引指示器和事件,但不能是常量.域.操作符.构造函数或析构函数,而且不能包含任何静态成员.接口定义创建新的定义空间,并且接口定义直 接包含的接口成 ...

  5. Dtree 添加 checkbox 复选框 可以默认选中

    一:目标 要实现用一个树形结构的展示数据,每个节点(除了根节点)前有一个checkbox,同时,点击父节点,则子节点全选或者全不选,当选中了全部子节点,父节点选中:如下图所示: 同时可以在创建的时候, ...

  6. STL笔记(こ)--删除数组中重复元素

    使用STL中的Unique函数: #include<bits/stdc++.h> using namespace std; void fun(int &n) //配套for_eac ...

  7. JSTree下的模糊查询算法——树结构数据层次遍历和递归分治地深入应用

    A表示区域节点,S表示站点结点 问题描述:现有jstree包含左图中的所有结点信息(包含区域结点和站点结点),需要做到输入站点名称模糊查询,显示查询子树结果如右图 解决策略: 1.先模糊查询所得站点所 ...

  8. 详解 JS 中 new 调用函数原理

    JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数),那在使用 new 调用一个函数的时候到底发生了什么?先看几个例子,再解释背后发生了什么. 1)看三个例子 1.1 ...

  9. vue.js 三(数据交互)isomorphic-fetch

    至于fetch的介绍,在这里就不多说了,官方和网络上的说明不少 之前使用jquery的Ajax朋友,可以尝试一下使用一下这个新的api 推荐使用isomorphic-fetch,兼容Node.js和浏 ...

  10. JavaScriptDate(日期)

    如何使用Date()方法获取当日的日期. getFullYear(): 使用getFullYear()获取年份. getTime(): getTime()返回1970年1月1日至今的毫秒数. setF ...