题目描述

小 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. JavaScript(第十五天)【匿名函数和闭包】

      学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...

  2. 201621123060《JAVA程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  3. C语言--第二周作业

    ****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...

  4. python 实现cm批量上传

    import requests import json import time import random url = 'http://cm.admin.xxxx.com/customer/aj_ad ...

  5. 【转载】NetFPGA-1G-CML从零开始环境配置

    ##环境 深度Linux ###环境配置 ```bash sudo apt-get install libsigc++ sudo apt-get install qgit sudo apt-get i ...

  6. Twisted 介绍 及TCP广播系统实例

    twisted 提供更多传输层 udp,tcp,tls及应用层HTTP,FTP等协议的支持,在开发方法上更提供了丰富的特性来支持异步编程 安装twisted 建议使用anaconda 安装,conda ...

  7. Oracle RAC环境下定位并杀掉最终阻塞的会话

    实验环境:Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2.常规方法:梳理找出最终阻塞会话 3.改进方法:立即找出最终阻塞会话 之前其实也写过一篇相关文章: 如何定 ...

  8. 从集合的无序性看待关系型数据库中的"序"

    本文目录:1.集合的特征2.集合的无序性3.表中记录的无序性4.集合的"序"和物理存储顺序之间的关系5.查询结果(虚拟表)的无序性.随机性6.为什么总是强调"无序&quo ...

  9. WebApi一个控制器中定义多个Get方法。

    问题:怎样解决一个ApiController中定义多个Get方法或者Post方法? 答:要想实现一个ApiController中定义多个Get方法或者Post方法,则需要在WebApiConfig类中 ...

  10. Python内置函数(44)——len

    英文文档: len(s) Return the length (the number of items) of an object. The argument may be a sequence (s ...