[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 ...
随机推荐
- JavaScript(第十五天)【匿名函数和闭包】
学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...
- 201621123060《JAVA程序设计》第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- C语言--第二周作业
****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...
- python 实现cm批量上传
import requests import json import time import random url = 'http://cm.admin.xxxx.com/customer/aj_ad ...
- 【转载】NetFPGA-1G-CML从零开始环境配置
##环境 深度Linux ###环境配置 ```bash sudo apt-get install libsigc++ sudo apt-get install qgit sudo apt-get i ...
- Twisted 介绍 及TCP广播系统实例
twisted 提供更多传输层 udp,tcp,tls及应用层HTTP,FTP等协议的支持,在开发方法上更提供了丰富的特性来支持异步编程 安装twisted 建议使用anaconda 安装,conda ...
- Oracle RAC环境下定位并杀掉最终阻塞的会话
实验环境:Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2.常规方法:梳理找出最终阻塞会话 3.改进方法:立即找出最终阻塞会话 之前其实也写过一篇相关文章: 如何定 ...
- 从集合的无序性看待关系型数据库中的"序"
本文目录:1.集合的特征2.集合的无序性3.表中记录的无序性4.集合的"序"和物理存储顺序之间的关系5.查询结果(虚拟表)的无序性.随机性6.为什么总是强调"无序&quo ...
- WebApi一个控制器中定义多个Get方法。
问题:怎样解决一个ApiController中定义多个Get方法或者Post方法? 答:要想实现一个ApiController中定义多个Get方法或者Post方法,则需要在WebApiConfig类中 ...
- Python内置函数(44)——len
英文文档: len(s) Return the length (the number of items) of an object. The argument may be a sequence (s ...