[HNOI2016]大数
题目描述
小 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的倍数。
输入输出格式
输入格式:
第一行一个整数:P。第二行一个串:S。第三行一个整数:M。接下来M行,每行两个整数 fr,to,表示对S 的子串S[fr...to]的一次询问。注意:S的最左端的数字的位置序号为 1;例如S为213567,则S[1]为 2,S[1...3]为 213。N,M<=100000,P为素数
输出格式:
输出M行,每行一个整数,第 i行是第 i个询问的答案。
输入输出样例
11
121121
3
1 6
1 5
1 4
5
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
说明
2016.4.19新加数据一组
把每一个后缀i~n的值%p算出来lst[i]
一个子串整除p满足:lst[i]=lst[j+1] (j>=i)
所以用莫队处理询问,每一次移动都是很好计算的
r向右走一步,相当于加上当前与lst[++r]相同的值ss[lst[++r]],在ss[lst[++r]]++
r向左走一步,相当于减去当前与lst[r]相同的值ss[lst[r]]--,再把r--
l相似
注意上面的条件和下面的莫队处理的都是lst[i]=lst[j+1],所以要把询问的右端点+1
还有要注意的,当p=2或p=5时要特判(不这样对不了)
这两个素数比较特殊
只要i能整除p,那么所有j~i都能整除p
用ss[]表示 前缀有多少个可以被p整除的子串 ls[]表示有多少个可以被P整除的数 求区间多少个子串的时候用ss[r]-ss[l-1]-(l-1中整除p对区间l~r的贡献)
=ss[r]-ss[l-1]-(l-1)*(ls[r]-ls[l-1])
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
struct Ask
{
ll id,l,r;
}q[];
ll sqn,m,n,lst[],ls[],ans[];
ll ss[];
map<ll,ll>Map;
char s[];
bool cmp(Ask a,Ask b)
{
if (a.l/sqn==b.l/sqn)
return a.r<b.r;
return a.l/sqn<b.l/sqn;
}
ll p;
int main()
{ll bt,i,l,r;
cin>>p;
cin>>s+;
cin>>m;
n=strlen(s+);
sqn=sqrt(n);
bt=;
if (p!=&&p!=)
{
for (i=n;i>=;i--)
{
bt=bt*%p;
lst[i]=(lst[i+]+(s[i]-'')*bt)%p;
ls[i]=lst[i];
}
sort(ls+,ls+n+);
for (i=;i<=n+;i++)
Map[ls[i]]=i;
for (i=;i<=n+;i++)
lst[i]=Map[lst[i]];
for (i=;i<=m;i++)
{
scanf("%lld%lld",&q[i].l,&q[i].r);
q[i].r++;
q[i].id=i;
}
sort(q+,q+m+,cmp);
int l=,r=;
long long cnt=;
for (i=;i<=m;i++)
{
while (r<q[i].r) cnt+=ss[lst[++r]]++;
while (r>q[i].r) cnt-=--ss[lst[r--]];
while (l>q[i].l) cnt+=ss[lst[--l]]++;
while (l<q[i].l) cnt-=--ss[lst[l++]];
ans[q[i].id]=cnt;
}
for (i=;i<=m;i++)
printf("%lld\n",ans[i]);
}
else
{
for (i=;i<=n;i++)
if (!((s[i]-'')%p))
ss[i]=ss[i-]+,ls[i]=ls[i-]+i;
else ss[i]=ss[i-],ls[i]=ls[i-];
for (i=;i<=m;i++)
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",ls[r]-ls[l-]-(ss[r]-ss[l-])*(l-));
}
}
}
[HNOI2016]大数的更多相关文章
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- BZOJ4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
随机推荐
- CodeBlocks使用介绍
CodeBlocks对单个文件没法调试,需要建工程后才能调试,所以使用CodeBlocks必须先建工程. 一.如何用CodeBlocks建工程文件. 选择File->New->Projec ...
- 网络1712--c语言一二维数组作业总结
1.成绩摆前头 1.1基本要求(1分) 按时交 - 有分 未交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 0分 泛泛而谈(最多七分) 1.2评分要点 PTA作业总结(4分) 同学代码互评 ...
- C语言实现Linux命令——od
C语言实现Linux命令--od 实现要求: 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写M ...
- 201621123062《java程序设计》第十周作业总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 思维导图: 2. 书面作业 本次PTA作业题集异常 2.1. 常用异常 结合题集题目7-1回答 2.1.1 自己以前 ...
- Alpha冲刺Day4
Alpha冲刺Day4 一:站立式会议 今日安排: 我们把项目大体分为四个模块:数据管理员.企业人员.第三方机构.政府人员.完成了数据库管理员模块.因企业人员与第三方人员模块存在大量的一致性,故我们团 ...
- mongodb 数据备份与恢复
备份 语法 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目录中 ...
- csrf学习笔记
CSRF全称Cross Site Request Forgery,即跨站点请求伪造.我们知道,攻击时常常伴随着各种各样的请求,而攻击的发生也是由各种请求造成的. CSRF攻击能够达到的目的是使受害者发 ...
- Web Api 利用 cors 实现跨域
一.安装 cors 二.修改 Web.config <appSettings> <add key="cors:allowedMethods" value=&quo ...
- maven 每次update后影响接口实现类的问题
遇到maven每次update后,就会更改eclipse中java Compiler中的jdk compliance版本 <plugin> <groupId>org.apach ...
- Tomcat8.0 配置环境
(1)首先安装JDk 下载jdk进行安装后进行配置环境 新增一个Java_Home的变量复制本地安装目录的路径:eg:C:\Program Files (x86)\Java\jdk1.8.0_141\ ...