题目描述

小 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个询问的答案。

输入输出样例

输入样例#1:

11
121121
3
1 6
1 5
1 4
输出样例#1:

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]大数的更多相关文章

  1. 【LG3245】[HNOI2016]大数

    [LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...

  2. 4542: [Hnoi2016]大数

    4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...

  3. 【BZOJ4542】[Hnoi2016]大数 莫队

    [BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...

  4. BZOJ.4542.[HNOI2016]大数(莫队)

    题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...

  5. BZOJ4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  6. 4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  7. [BZOJ4542] [Hnoi2016] 大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  8. bzoj 4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  9. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

随机推荐

  1. 第一周C语言作业

    一.PTA实验作业 题目1.温度转换 1.实验代码 int main() { int fahr = 150,celsius; celsius = 5 * (fahr - 32) / 9; printf ...

  2. 201621123062《java程序设计》第六周作业总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  3. python的测试

    测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...

  4. 项目Beta冲刺Day4

    项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...

  5. Scala 对象

    1. 单例对象 对于任何你在Java中会使用单例对象的地方, 在scala中都可以使用对象来实现; scala字段没有静态方法或者静态字段, 可以使用object语法结构达到同样的效果,对象(obje ...

  6. vue 手机端开发 小商铺 添加购物车 以及结算 功能

    这个功能绕了我一天!!!            对 就是这个功能  一系列相关联的  四处相关联 现在加班 没时间更 过两天在更

  7. 13-TypeScript单例模式

    在JavaScript中,要实现设计模式比较复杂.而在TypeScript中因为使用面向对象的思想编程,要实现设计模式的方式与后端语言C#.Java等非常类似. 单例模式是一种常用的设计模式,通常用于 ...

  8. python-装饰器简述

    装饰器是什么 用来修饰别的函数的函数就可以称之为装饰器 这种函数的参数一般就是另外一个函数 也就是说,调用这种函数,需要给这种函数传参,且参数是函数 @语法糖 @语法糖一般用来表示装饰器函数 不用@也 ...

  9. lamp环境搭建经验总结

    环境:centos6.4,13个源码包:参考教程高罗峰细说php思路:1.首先确定gcc,g++的安装,因为这是c语言的编译工具,没有它,源码不可能安装,redhat的yum需要配置,分为本地源和网络 ...

  10. mingw打dll ,lib包命令和调用

    1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...