loj #2053 莫队
\(des\)
存在一个长度为 \(n\) 的数字 \(s\), 一个素数 \(P\)
\(m\) 次询问一段区间 \([l, r]\) 内的子串构成的数是 \(P\) 的倍数
\(sol\)
对于一次询问 \([l, r]\)
答案为
\]
等价于
\]
当 \(P \ne 2 且 P \ne 5\) 时,\(p \nmid 10^j\)
所以原式等价于
\]
令
\(a_k = s_k \times 10^{-k} \pmod P\)
\(sum_k = \sum_{i=1}^{k} a_i \pmod P\)
所以原式等价于
& \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 莫队的更多相关文章
- LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)
		LOJ 莫队.发现只需要维护前驱后继就可以了. 但是加入一个点需要找到它当前的前驱后继,很麻烦还带个\(\log\). 但是如果只有删除某个点,只需要更新一下它的前驱后继即可. 用回滚莫队就好惹. 撤 ... 
- LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)
		题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ... 
- loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)
		传送门 模拟赛的时候纯暴力竟然骗了\(70\)分-- 首先对于一堆\(g\)怎么计算概率应该很好想,用总的区间数减去不合法的区间数就行了,简而言之对\(g\)排个序,每一段长为\(d\)的连续序列的区 ... 
- BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)
		BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ... 
- [Ynoi2016]这是我自己的发明(莫队)
		话说这道题数据是不是都是链啊,我不手动扩栈就全 \(RE\)... 不过 \(A\) 了这题还是很爽的,通过昨晚到今天早上的奋斗,终于肝出了这题 其实楼上说的也差不多了,就是把区间拆掉然后莫队瞎搞 弱 ... 
- BZOJ4241:历史研究(回滚莫队)
		Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ... 
- 「雅礼集训 2018 Day5」Convex 凸包、莫队
		LOJ 看到离线区间操作仍然考虑莫队,然后可以发现:我们对于原来的凸包集合按照极角序维护一个链表,那么删除一个位置可以\(O(1)\),撤回删除操作也可以\(O(1)\)(因为原来的链表结构中当前节点 ... 
- bzoj5016 & loj2254 [Snoi2017]一个简单的询问   莫队
		题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ... 
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
		3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ... 
随机推荐
- [洛谷P5431]【模板】乘法逆元2
			题目大意:给定$n(n\leqslant5\times10^6)$个正整数$a_i$,和$k$.求:$$\sum_{i=1}^n\dfrac{k^i}{a_i}\pmod p$$题解:$$令P=\pr ... 
- LOJ2484 CEOI2017 Palindromic Partitions DP、回文树
			传送门 当我打开Luogu题解发现这道题可以Hash+贪心的时候我的内心是崩溃的-- 但是看到这道题不都应该认为这是一道PAM的练手好题么-- 首先把原字符串重排为\(s_1s_ks_2s_{k-1} ... 
- java8之lambda表达式(默认方法)
			[推荐]2019 Java 开发者跳槽指南.pdf(吐血整理)>>> 许多开发语言都将函数表达式集成到了其集合库中.这样比循环方式所需的代码更少,并且更加容易理解.以下面的循环为例: ... 
- Maven过滤属性文件,替换属性值
			pom.xml 1.resources: resources中是定义哪些目录下的文件会被配置文件中定义的变量替换,一般我们会把项目的配置文件放在src/main/resources下,像db,bean ... 
- TeX 家族(TeX, pdfTeX, XeTeX, LuaTeX, LaTeX, pdfLaTeX, XeLaTeX …)
			TeX 家族 带有 TeX 的词,仅仅是本文就已经提到了 TeX, LaTeX, XeLaTeX.通常中国学生面对不了解意思的一群形近单词,都会有一种「本能的恐惧」(笑~).因此,「大神们」在为新手介 ... 
- 编译基于obs-studio的阿里巴巴直播工具tblive的过程和常见问题解决
			tblive 简介 tblive开源项目对应的产品是千牛主播,是一个独立的PC端主播工具,基于开源软件OBS Studio来修改定制. 项目说明 tblive是一款优秀的基于obs-studio的直播 ... 
- C语言中特殊字符含义
			字符 中文 英文 说明 \n 换行符 newline \t Tab键 \b backspace 退格键 
- python 爬虫  user-agent 生成
			有些网站做了反爬技术,如:比较初级的通过判断请求头部中的user-agent字段来检测是否通过浏览器访问的. 在爬这类网站时需要模拟user-agent import random import re ... 
- H5调起IOS原生商店支付
			参考文档:http://www.html5plus.org/doc/zh_cn/payment.html 申请内购项目摘自 https://www.jianshu.com/p/1e79bfbe46e2 ... 
- JS中BOM和DOM常用的事件
			总结:window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开新 ... 
