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个询问的答案。

Sample Input

11
121121
3
1 6
1 5
1 4

Sample Output

5
3
2
  //第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。

HINT

Source

  2016.4.19新加数据一组

Solution

  把n个后缀组成的数字全部对p取模。

  若s[l] ~ s[n]的余数和s[r] ~ s[n]的余数相同,那么s[l] ~ s[r - 1]区间内的数字就是p的倍数(l < r)

  这里有例外:当p = 2或p = 5时不成立。

  然后这个题就变成经典莫队题了:给定一个序列,每次询问[l, r]内有多少对相同的数

  每一个余数i给一个计数器ba[i](需离散化),记录[l, r]中这个数出现了几次,区间长度±1时答案改变值为ba[i]。

  然后。。。原数据里没有p = 2或p = 5的情况。。。所以就没有然后了。然而BZOJ加了组数据

  p = 2或p = 5时,用两个数组分别表示[1, i]中2或5的倍数时有多少种情况及有多少个数末尾是2或5的倍数,用前缀和维护。这部分就很简单了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll sqn, lst[100005], cd[100005], ba[100005], ans[100005];
 5 struct query
 6 {
 7     ll id, l, r;
 8     bool operator < (const query &rhs) const
 9     {
10         if(l / sqn == rhs.l / sqn) return r < rhs.r;
11         return l / sqn < rhs.l / sqn;
12     }
13 }q[100005];
14 char s[100005];
15 map<ll, ll> Map;
16 int main()
17 {
18     ll n, m, p, l = 1, r = 0, cur = 0, bt = 1;
19     scanf("%lld%s%lld", &p, s + 1, &m);
20     n = strlen(s + 1), sqn = (ll)sqrt(n * 1.0);
21     if(p != 2 && p != 5)
22     {
23         for(ll i = n; i; i--)
24         {
25             bt = bt * 10 % p;
26             lst[i] = (lst[i + 1] + (s[i] - 48) * bt) % p;
27             cd[i] = lst[i];
28         }
29         sort(cd + 1, cd + n + 1);
30         for(ll i = 1; i <= n + 1; i++)
31             Map[cd[i]] = i;
32         for(ll i = 1; i <= n + 1; i++)
33             lst[i] = Map[lst[i]];
34         for(ll i = 1; i <= m; i++)
35         {
36             scanf("%lld%lld", &q[i].l, &q[i].r);
37             q[i].id = i, q[i].r++;
38         }
39         sort(q + 1, q + m + 1);
40         for(ll i = 1; i <= m; i++)
41         {
42             while(r < q[i].r) cur += ba[lst[++r]]++;
43             while(l > q[i].l) cur += ba[lst[--l]]++;
44             while(l < q[i].l) cur -= --ba[lst[l++]];
45             while(r > q[i].r) cur -= --ba[lst[r--]];
46             ans[q[i].id] = cur;
47         }
48         for(ll i = 1; i <= m; i++)
49             printf("%lld\n", ans[i]);
50     }
51     else
52     {
53         for(ll i = 1; i <= n; i++)
54             if(!((s[i] - 48) % p))
55                 ba[i] = ba[i - 1] + 1, cd[i] = cd[i - 1] + i;
56             else
57                 ba[i] = ba[i - 1], cd[i] = cd[i - 1];
58         for(ll i = 1; i <= m; i++)
59         {
60             scanf("%lld%lld", &l, &r);
61             printf("%lld\n", cd[r] - cd[l - 1] - (ba[r] - ba[l - 1]) * (l - 1));
62         }
63     }
64     return 0;
65 }

View Code

转载于:https://www.cnblogs.com/CtrlCV/p/5407753.html

[BZOJ4542] [Hnoi2016] 大数 (莫队)相关推荐

  1. 4542: [Hnoi2016]大数|莫队

    HN一天考两个莫队是什么鬼..或者说莫队不是正确的姿势..? 考虑已经知道了 l..r l..r的答案新添入 r+1 r+1如何更新当前答案 需要先预处理出后缀 modp mod p的值 bi b_i ...

  2. 洛谷 - P3246 [HNOI2016]序列(莫队+单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答一个区间 [l,r][l,r][l,r] 内所有子区间的最小值之和 题目分析:因为可以离线,所以考 ...

  3. P3246 [HNOI2016]序列 莫队 + ST表 + 单调栈

    传送门 文章目录 题意: 思路: Update 题意: 思路: 比较神奇的一个题,这里先介绍莫队的离线解法. 不难发现,用莫队来做最大的难点就是在进行区间移动的时候如何快速计算贡献. 比如[l,r]− ...

  4. 【bzoj5452】[Hnoi2016]大数(莫队)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4542 首先若p=2,5则这题就是道傻逼题,前缀和搞一下没了.如果p为其他质数,那么可以 ...

  5. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...

  6. [HNOI2016] 大数(莫队)

    problem luogu-P3245 solution 将这个 nnn 位数从右往左的记录取模 ppp 的结果,即 f(i)=(f(i−1)∗10+si)%pf(i)=(f(i-1)*10+s_i) ...

  7. 【BZOJ4542】大数, 莫队

    Time:2016.09.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 神奇的东西 断断续续地想了一天没搞出来 因为没想到离散化(╯‵□′)╯︵┻━┻ 有一个有趣的性质 定义 ...

  8. P3246 [HNOI2016]序列(莫队+单调栈+ST表)

    [HNOI2016]序列 Tea神题解 Kelin神题解 对于莫队算法最主要的是如何快速算出[l,r]→[l,r+1][l,r]\to[l,r+1][l,r]→[l,r+1]对答案的贡献的变化. 当询 ...

  9. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1567  Solved: 718 [Submit][Statu ...

最新文章

  1. [转]如何在保证睡眠的情况下高效学习
  2. 2.1 基于文件读写图像数据
  3. C++八皇后拼图,打印所有的算法(附完整源码)
  4. 编程基础python学习2完结
  5. linux程序多少位,查看linux版本是多少位
  6. ACM学习历程—HDU 2112 HDU Today(map spfa 优先队列)
  7. 微信小程序云开发教程-WXML入门-数据绑定
  8. 使用ASP.NET Atlas ItemView控件显示集合中的单个数据
  9. lammps教程:delete_atoms 命令详解
  10. 德乐Derler T-1series 120G SSD固态硬盘不认盘修复/开卡一例(SM2258XT主控),SM2259XT2可参考
  11. 紫罗兰永恒花园rust简谱_みちしるべ简谱-紫罗兰永恒花园ed
  12. 设计一个自我介绍简单页面
  13. QT VS2019 OpenCV yolo4 摄像头识别人脸
  14. js对象转byte数组
  15. PDR (Pedestrian Dead Reckoning)行人航位推算基本原理及实现
  16. android黑科技系列——微信抢红包插件原理解析和开发实现
  17. excel表格如何拆分数据
  18. Ix Chariot测试路由器流程
  19. MySQL中时间日期类型的使用
  20. 多线程异常处理:挖掘页面空窗背后的原因

热门文章

  1. Acwing第 34 场周赛
  2. oracle中的自增关键字,Oracle中设置自增字段
  3. matlab写的串口通信图像上位机,MATLAB的串口通信
  4. Codeforces Round #533 (Div. 2) 部分题解A~D
  5. ArcGIS Engine中如何获取Map中已经选择的要素呢(转)
  6. 用Python来玩微信跳一跳
  7. bootstrap-面板
  8. 0712 - 坚守,加强老本
  9. Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程) 分类:Androidandroid实例...
  10. 【转】比较page、request、session、application的使用范围