\(des\)

存在一个长度为 \(n\) 的数字 \(s\), 一个素数 \(P\)

\(m\) 次询问一段区间 \([l, r]\) 内的子串构成的数是 \(P\) 的倍数

\(sol\)

对于一次询问 \([l, r]\)

答案为

\[\sum_{i=l}^{r} \sum_{j=i}^{r}[(\sum_{k=i}^{j} s_{k} \times 10^{j-k}) \pmod P \equiv 0]
\]

等价于

\[\sum_{i=l}^{r} \sum_{j=i}^{r} [10^{j} (\sum_{k=i}^{j} s_{k} \times 10^{-k}) \pmod P \equiv 0]
\]

当 \(P \ne 2 且 P \ne 5\) 时,\(p \nmid 10^j\)

所以原式等价于

\[\sum_{i=l}^{r} \sum_{j=i}^{r} [(\sum_{k=i}^{j} s_{k} \times 10^{-k}) \pmod P \equiv 0]
\]



\(a_k = s_k \times 10^{-k} \pmod P\)

\(sum_k = \sum_{i=1}^{k} a_i \pmod P\)

所以原式等价于

\[\begin{split}
& \sum_{i=l}^{r} \sum_{j=i}^{r} [(\sum_{k=i}^{j} a_k) \pmod P \equiv 0] \\
= &\sum_{i=l}^{r} \sum_{j=i}^{r} [(sum_j = sum_{i-1})]
\end{split}
\]

对 \(sum\) 离散化后转化为区间查询相等的数的个数

莫队

对于 \(P = 2 或 P = 5\) 的情况特判即可

时间复杂度 \(O(n^{1.5} + nlogn)\)

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10; #define Rep(i, a, b) for(int i = a; i <= b; i ++)
#define LL long long #define gc getchar()
inline int read() {
int x = 0; char c = gc;
while(c < '0' || c > '9') c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
return x;
} int P, n, m;
char s[N];
int pos[N], block;
struct Node {
int l, r, id;
bool operator < (const Node a) const {
if(pos[this-> l] == pos[a.l]) return pos[this-> r] < pos[a.r];
return pos[this-> l] < pos[a.l];
}
} Ask[N]; LL S[N], A[N], Sum[N], Ten[N] = {0, 10};
LL Copysum[N];
LL Tong[N], Answer[N]; LL Ksm(LL a, LL b) {
LL ret = 1;
while(b) {
if(b & 1) ret = ret * a % P;
a = a * a % P;
b >>= 1;
}
return ret;
} LL Now_ans; inline void Cut(int x) {Tong[Sum[x]] --; Now_ans -= Tong[Sum[x]];}
inline void Add(int x) {Now_ans += Tong[Sum[x]]; Tong[Sum[x]] ++;} void MoDui() {
int L = Ask[1].l, R = L - 1;
Rep(i, 1, m) {
int l = Ask[i].l - 1, r = Ask[i].r;
for(; L < l; L ++) Cut(L);
for(; R > r; R --) Cut(R);
for(; L > l; L --) Add(L - 1);
for(; R < r; R ++) Add(R + 1);
Answer[Ask[i].id] = Now_ans;
}
} LL totsum[N], totcnt[N]; void Special_Judge() {
Rep(i, 1, n) {
totcnt[i] = totcnt[i - 1] + ((s[i] - '0') % P == 0 ? 1 : 0);
totsum[i] = totsum[i - 1] + ((s[i] - '0') % P == 0 ? i : 0);
}
Rep(i, 1, m) {
int l = Ask[i].l, r = Ask[i].r;
cout << totsum[r] - totsum[l - 1] - (l - 1) * (totcnt[r] - totcnt[l - 1]) << "\n";
}
} int main() {
P = read();
scanf("%s",s + 1);
n = strlen(s + 1);
m = read();
Rep(i, 1, m) Ask[i] = (Node) {read(), read(), i};
if(P == 2 || P == 5) {
Special_Judge(); return 0;
}
block = sqrt(n);
Rep(i, 1, n) pos[i] = (i - 1) / block + 1;
sort(Ask + 1, Ask + m + 1);
Rep(i, 1, n) S[i] = (s[i] - '0') % P;
Rep(i, 2, n) Ten[i] = (Ten[i - 1] * 10) % P;
Rep(i, 1, n) A[i] = S[i] * Ksm(Ten[i], P - 2) % P;
Rep(i, 1, n) Sum[i] = (Sum[i - 1] + A[i]) % P;
Rep(i, 1, n) Copysum[i] = Sum[i];
sort(Copysum + 1, Copysum + n + 1);
Rep(i, 1, n) Sum[i] = lower_bound(Copysum, Copysum + n + 1, Sum[i]) - Copysum;
MoDui();
Rep(i, 1, m) cout << Answer[i] << "\n";
return 0;
}

loj #2053 莫队的更多相关文章

  1. LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)

    LOJ 莫队.发现只需要维护前驱后继就可以了. 但是加入一个点需要找到它当前的前驱后继,很麻烦还带个\(\log\). 但是如果只有删除某个点,只需要更新一下它的前驱后继即可. 用回滚莫队就好惹. 撤 ...

  2. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...

  3. loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)

    传送门 模拟赛的时候纯暴力竟然骗了\(70\)分-- 首先对于一堆\(g\)怎么计算概率应该很好想,用总的区间数减去不合法的区间数就行了,简而言之对\(g\)排个序,每一段长为\(d\)的连续序列的区 ...

  4. BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)

    BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...

  5. [Ynoi2016]这是我自己的发明(莫队)

    话说这道题数据是不是都是链啊,我不手动扩栈就全 \(RE\)... 不过 \(A\) 了这题还是很爽的,通过昨晚到今天早上的奋斗,终于肝出了这题 其实楼上说的也差不多了,就是把区间拆掉然后莫队瞎搞 弱 ...

  6. BZOJ4241:历史研究(回滚莫队)

    Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...

  7. 「雅礼集训 2018 Day5」Convex 凸包、莫队

    LOJ 看到离线区间操作仍然考虑莫队,然后可以发现:我们对于原来的凸包集合按照极角序维护一个链表,那么删除一个位置可以\(O(1)\),撤回删除操作也可以\(O(1)\)(因为原来的链表结构中当前节点 ...

  8. bzoj5016 & loj2254 [Snoi2017]一个简单的询问 莫队

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ...

  9. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

随机推荐

  1. [LOJ2290] [THUWC2017] 随机二分图

    题目链接 LOJ:https://loj.ac/problem/2290 洛谷:https://www.luogu.org/problemnew/show/P4547 Solution 首先考虑只有第 ...

  2. Unity3D 跨平台原理

    Unity3D的跨平台原理核心在于对指令集CIL(通用中间语言)的应用. 机理 首先需要知道,Unity中的Mono是基于 通用语言架构(Common Language Infrastructure, ...

  3. 【转】Redis 基础操作和命令

    笔记 Redis提供了六种基本的数据结构:String,Hash,List,Set,Sorted Set,HyperLogLog. Redis的特点:纯内存操作,单线程工作模型,非阻塞I/O多路复用. ...

  4. c# 基于委托的异步编程模型(APM)测试用例

    很多时候,我们需要程序在执行某个操作完成时,我们能够知道,以便进行下一步操作. 但是在使用原生线程或者线程池进行异步编程,没有一个内建的机制让你知道操作什么时候完成,为了克服这些限制,基于委托的异步编 ...

  5. 【图解】cpu,内存,硬盘,指令的关系

    1 程序员用高级语言编写程序. 2 经过编译 链接等形成机器语言的EXE文件. 3 EXE文件保持在磁盘的某个或多个扇区内 4 程序运行是在内存中生成EXE的副本 5 将指令读入cpu的寄存器 6 由 ...

  6. 用JS实现一个斗地主发牌器

    //调用随机数,在我上一篇博文讲过这一个函数. function roundNum(min = 0, max = 0) { if (!isNaN(min) && !isNaN(max) ...

  7. springmvc集成cxf的方法

    最近需要在项目中增加webservice接口,供三方调用,下面就把集成的方法展示如下,供大家参考: 第一步:服务端的发布; 1:配置web.xml文件,添加cxf的servlet <servle ...

  8. ECSHOP(3.0.0升级3.6.0)帮助教程

    说明: 本文档只针对于未做过二开的ECSHOP3.0 用户 1.准备材料 先确保正在使用的ECShop系统版本为ecshop3.0.0并且代码没有经过二次开发,然后下载最新的ECShop3.6.0安装 ...

  9. [AIR] NativeExtension在IOS下的开发实例 --- 新建项目测试ANE(四)

    来源:http://bbs.9ria.com/thread-102043-1-1.html 通过前面的努力,好了,我们终于得到了一个ANE文件了.下面我们开始新建一个Flex Mobile项目做一下测 ...

  10. PHP/Python---百钱百鸡简单实现及优化

    公鸡5块钱一只,母鸡3块钱一只,小鸡一块钱3只,用100块钱买一百只鸡,问公鸡,母鸡,小鸡各要买多少只? 今天看到这题很简单 ,但是随手写出来后发现不是最优的