大数(bzoj 4542)
/*
想了半天莫队,不知道咋转移,需要动下脑子。
有一个很显然的结论是如果(l,r)是P的倍数,那么s[l...n]%P=s[r+1...n]%P。
根据这个东西,我们预处理出所有的后缀%P的余数,接下里就是查询区间内相同得数对数量,就很好转移了。
有一点,当P=2或5时,不否和上面的情况,需单独讨论。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define N 200010
#define lon long long
using namespace std;
lon n,m,p,len,a[N],b[N],cnt[N],ans[N];char s[N];
map<lon,lon> mp;
struct node{
lon l,r,id;
bool operator<(node s1) const{
if(l/len==s1.l/len) return r<s1.r;
return l/len<s1.l/len;
}
}q[N];
int main(){
scanf("%lld%s%lld",&p,s+,&m);
n=strlen(s+);len=(lon)sqrt(n);
if(p!=&&p!=){
lon bt=;
for(lon i=n;i;i--){
bt=bt*%p;
a[i]=(a[i+]+(s[i]-'')*bt)%p;
b[i]=a[i];
}
sort(b+,b+n+);
for(lon i=;i<=n+;i++)
mp[b[i]]=i;
for(lon i=;i<=n+;i++)
a[i]=mp[a[i]];
for(lon i=;i<=m;i++){
scanf("%lld%lld",&q[i].l,&q[i].r);
q[i].id=i;q[i].r++;
}
sort(q+,q+m+);
lon l=,r=,cur=;
for(lon i=;i<=m;i++){
while(r<q[i].r) ++r,cur+=cnt[a[r]]++;
while(l>q[i].l) --l,cur+=cnt[a[l]]++;
while(l<q[i].l) cur-=--cnt[a[l]],l++;
while(r>q[i].r) cur-=--cnt[a[r]],r--;
ans[q[i].id]=cur;
}
for(lon i=;i<=m;i++)
printf("%lld\n",ans[i]);
}
else {
for(lon i=;i<=n;i++)
if(!((s[i]-'')%p))
cnt[i]=cnt[i-]+,a[i]=a[i-]+i;
else cnt[i]=cnt[i-],a[i]=a[i-];
for(lon i=;i<=m;i++){
lon l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",a[r]-a[l-]-(cnt[r]-cnt[l-])*(l-));
}
}
return ;
}
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
121121
3
1 6
1 5
1 4
Sample Output
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
大数(bzoj 4542)的更多相关文章
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- bzoj 4542 [Hnoi2016]大数 (坑)
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...
- bzoj 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 【BZOJ】4542: [Hnoi2016]大数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4542 给定一个由数字构成的字符串${S_{1,2,3,...,n}}$,一个正素数$P$, ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
随机推荐
- Robot Framework(十) 执行测试用例——测试执行
3.2测试执行 本节描述如何执行从解析的测试数据创建的测试套件结构,如何在失败后继续执行测试用例,以及如何正常停止整个测试执行. 3.2.1执行流程 执行套房和测试 设置和拆卸 执行顺序 3.2.2继 ...
- VC-基础:VC++动态链接库(DLL)编程深入浅出
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
- scanf函数详解
函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...
- javaEE(16)_Servlet监听器
一.监听器原理 1.监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 2.监听器典型案例 ...
- Mac 输入法小技巧
相信使用Mac的朋友第一次使用Mac首先要考虑的就是输入法的问题,现在越来越多的第三方输入法都开始支持Mac平台,是否有同学仍然执着于看似“不符”国人习惯用法的OS X自带拼音输入法呢?自带的拼音输入 ...
- Java 局部变量未初始化会报错,局部变量没有初始值,成员变量有初始值
Java 成员变量有初始值,而局部变量没有初始值. 如下所示,代码不能编译通过 public static void main(String[] args){ String s; Sy ...
- java代码解析二维码
java代码解析二维码一般步骤 本文采用的是google的zxing技术进行解析二维码技术,解析二维码的一般步骤如下: 一.下载zxing-core的jar包: 二.创建一个BufferedImage ...
- Linux下基于LVM调整分区容量大小的方法
Linux下调整分区容量大小的方法(适用于centos6-7) 说明:以下方法均使用centos6.9和centos7.4进行测试. Centos6分区容量调整方法 1.web分区空间不足,新添加一块 ...
- mysql8忘记root密码修改密码(mac)
0.在/etc/my.cnf修改验证方式 [mysqld] default_authentication_plugin=mysql_native_password 1.切换root权限: sudo s ...
- element使用心得
Table Table 常用属性解释 数据过滤,filter过滤器 <el-table-column width="200" show-overflow-tooltip la ...