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。

HINT

2016.4.19新加数据一组

 
题解:
把后缀模p的数搞出来离散化一下就可以上莫队了
注意p=2或p=5
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long int64;
char ch;
bool ok;
void read(int &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
void read(int64 &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
char s[maxn];
int n,q,sn,x,y,bel[maxn],tot,cnt[maxn];
int64 mod,a[maxn],ans[maxn],res,pw[maxn],list[maxn];
struct Querys{
int l,r,id;
void init(int i){read(l),read(r),l=n-l+,r=n-r+,swap(l,r),l--,/*cout<<"FFFF "<<l<<' '<<r<<endl,*/id=i;}
}querys[maxn];
bool cmp(const Querys &a,const Querys &b){return bel[a.l]<bel[b.l]||(bel[a.l]==bel[b.l]&&bel[a.r]<bel[b.r]);}
void modify(int col,int op){
if (op==) /*cout<<res<<' '<<col<<' '<<cnt[col]<<endl,*/res+=cnt[col],cnt[col]++;
else cnt[col]--,res-=cnt[col];
}
void work(){
int l=,r=; cnt[a[]]=,res=;
for (int i=;i<=q;i++){
for (;l<querys[i].l;l++) modify(a[l],-);
for (;l>querys[i].l;l--) modify(a[l-],);
for (;r<querys[i].r;r++) modify(a[r+],);
// cout<<"res="<<res<<endl;
for (;r>querys[i].r;r--) modify(a[r],-);
ans[querys[i].id]=res;
}
}
int cnt2[maxn],cnt5[maxn];
int64 ans2[maxn],ans5[maxn];
int main(){
read(mod);
if (mod==){
scanf("%s",s+),n=strlen(s+);
for (int i=;i<=n;i++){
cnt2[i]=cnt2[i-],ans2[i]=ans2[i-];
if ((s[i]-'')%==) cnt2[i]++,ans2[i]+=i;
}
for (read(q);q;q--){
read(x),read(y);
printf("%lld\n",ans2[y]-1LL*(cnt2[y]-cnt2[x-])*(x-)-ans2[x-]);
}
}
else if (mod==){
scanf("%s",s+),n=strlen(s+);
for (int i=;i<=n;i++){
cnt5[i]=cnt5[i-],ans5[i]=ans5[i-];
if ((s[i]-'')%==) cnt5[i]++,ans5[i]+=i;
}
for (read(q);q;q--){
read(x),read(y);
printf("%lld\n",ans5[y]-1LL*(cnt5[y]-cnt5[x-])*(x-)-ans5[x-]);
}
}
else{
scanf("%s",s+),n=strlen(s+),sn=sqrt(n);
for (int i=,j=n;i<j;i++,j--) swap(s[i],s[j]);
for (int i=;i<=n;i++) bel[i]=i/sn;
// for (int i=0;i<=n;i++) cout<<i<<' ';cout<<endl;
// for (int i=0;i<=n;i++) cout<<bel[i]<<' ';cout<<endl;
pw[]=;
for (int i=;i<=n;i++) pw[i]=1LL*pw[i-]*%mod;
for (int i=;i<=n;i++) a[i]=(a[i-]+1LL*(s[i]-'')*pw[i-]%mod)%mod;
for (int i=;i<=n;i++) list[++tot]=a[i];
sort(list+,list+tot+),tot=unique(list+,list+tot+)-list-;
// for (int i=0;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
for (int i=;i<=n;i++) a[i]=lower_bound(list+,list+tot+,a[i])-list;
// for (int i=0;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
read(q);
// cout<<q<<endl;
for (int i=;i<=q;i++) querys[i].init(i);
// for (int i=1;i<=q;i++) cout<<querys[i].l<<' '<<querys[i].r<<' '<<querys[i].id<<endl;
sort(querys+,querys+q+,cmp);
work();
for (int i=;i<=q;i++) printf("%lld\n",ans[i]);
}
return ;
}
/*
11
121121
3
1 6
1 5
1 4
*/

4542: [Hnoi2016]大数的更多相关文章

  1. 4542: [Hnoi2016]大数

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

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

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

  3. 【BZOJ】4542: [Hnoi2016]大数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4542 给定一个由数字构成的字符串${S_{1,2,3,...,n}}$,一个正素数$P$, ...

  4. bzoj 4542 [Hnoi2016]大数 (坑)

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...

  5. bzoj 4542: [Hnoi2016]大数

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

  6. bzoj 4542: [Hnoi2016]大数 (莫队)

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

  7. 【LG3245】[HNOI2016]大数

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

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

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

  9. 【bzoj4542】 Hnoi2016—大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...

随机推荐

  1. hashCode与equals详解

    在工作中写业务类通常都会重写hashCode与equals方法,而这两个方法的区别与用途也常常被问道.平时也只是大概知道这二者的用途,今天闲下来,查阅资料加上自己的理 解,总结记录下. hashCod ...

  2. springMVC零配置吐槽

    此时此刻,哥哥我不得不大大的吐槽一下.从github上down下来一个spring-mvc的chat演示样例,牛逼作者用的是注解的方式,项目全然零配置.而我眼下用的springMVC框架,还是在xml ...

  3. 《Linux内核修炼之道》 系列

    http://blog.csdn.net/fudan_abc/article/category/655796

  4. window mac iPhone 三种比较相似的字体

    win: 华文黑体 mac:stheiti iphone:heitisc-light heitisc-medium

  5. 一个类搞定UIScrollView那些事

    前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...

  6. Javascript 异步编程的4种方法详解

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...

  7. Grant-Permission.ps1

    Grant-Permission.ps1 Download the EXE version of SetACL 3.0.6 for 32-bit and 64-bit Windows. Put set ...

  8. Bootstrap学习——起步

    一,前言 个人不是专业从事前端开发,但在一个小公司里工作,作为有过这样经历的程序员都知道,开发一个网站或者是一个管理系统,程序员基本所有的事都包了,真是什么都要懂一点啊.而我个人也不怎么喜欢写CSS和 ...

  9. final----这篇文章是我收获很大

    final 用于声明属性.方法和类,分别表示属性不可变,方法不可重写,类不可继承. [转]Java final 修饰符知识点总结 final从字面上理解含义为“最后的,最终的”.在Java中也同样表示 ...

  10. Python编写相关注意事项

    1.# -*- coding: utf-8 -*-代码首部添加这个,不然会报Non_ASCII charater错误 python闭包:实际应用场景1.保持闭包运行完后的环境: 2.根据外部作用域的局 ...