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. DevExpress 用户控件 分页(下)

    分页控件调用 (1)初始化时: this.pageCtrl1.pageSize = 4; (2)数据绑定时: 从数据库中获取实时的 Public void LoadData(){ //这是只写有关分页 ...

  2. sql执行计划解析案例(二)

    sql执行计划解析案例(二)   今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究.但是在研究cache buffe ...

  3. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...

  4. [Redux] Filtering Redux State with React Router Params

    We will learn how adding React Router shifts the balance of responsibilities, and how the components ...

  5. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  6. WPF中将DataGrid导出Excel

    int number = 1; private void MenuItem_Click(object sender, RoutedEventArgs e) { #region string path ...

  7. td中使用overflow:hidden; 无效解决方案

    td中使用overflow:hidden; 无效解决方案 >>>>>>>>>>>>>>>>>> ...

  8. hibernate使用sql语句查询实体时,要写上addEntity

    abDAO.getSession().createSQLQuery(hql).addEntity(对象.class).list(); 参考http://blog.csdn.net/vacblog/ar ...

  9. 如何使用event 10049分析定位library cache lock and library cache pin

    Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...

  10. Object-c 创建对象

    创建对象有两种方法: 1. NSString *str = [NSString string]; 2. NSString *myStr = [[NSString alloc]init]; 第一种创建方 ...