/*
想了半天莫队,不知道咋转移,需要动下脑子。
有一个很显然的结论是如果(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

11
121121
3
1 6
1 5
1 4

Sample Output

5
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
 

最新文章

  1. C#~异步编程再续~大叔所理解的并行编程(Task&amp;Parallel)
  2. Mediawiki
  3. 5个常用Java代码混淆器 助你保护你的代码
  4. JQuery源码之“对象的结构解析”
  5. Linux系统编程(26)——守护进程
  6. spring读取properties文件
  7. ES学习笔记
  8. OpenStack(企业私有云)万里长征第二步——使用Fuel部署
  9. mysql不能插入中文数据
  10. 【NOIP2013货车运输】
  11. Windows服务启动进程----Cjwdev.WindowsApi.dll
  12. 2018-2019-2 20175211 实验一《Java开发环境的熟悉》实验报告
  13. 中断描述符表(Interrupt Descriptor Table,IDT)
  14. 硬件GPIO,UART,I2C,SPI电路图
  15. HDUOJ---4503 湫湫系列故事——植树节
  16. mysql截取字段并插入到新的字段中
  17. js 多个事件的绑定及移除(包括原生写法和 jquery 写法)
  18. OpenShift DNS的机制
  19. grafana-zabbix图形简单配置
  20. 我与前端之间不得不说的三天两夜之javaScript

热门文章

  1. ARC和MRC混合模式下的编译问题
  2. 迅为4412开发板Linux设备树的镜像烧写和源码简单优化教程
  3. Higher level thinking
  4. vue 封装组件上传img
  5. perl:split函数用法
  6. shell-code-6-输入输出重定向
  7. rootfs注册挂载过程分析
  8. django的rest framework框架——认证、权限、节流控制
  9. 【UOJ#51】【UR #4】元旦三侠的游戏(博弈论)
  10. AVL树总结