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

可以考虑用莫队解决区间询问
对于p!=2且p!=5,预处理串的每个后缀mod p的值,若两后缀mod p相等则它们间的一段mod p=0
若p=2或5,则一个串mod p为0当且仅当末尾能被p整除
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
typedef long long lint;
lint Ans=;
int m;
char s[];
struct Q{
int l,r,id;
}q[];
lint ans[];
int b,l,p;
int mp[],id[];
inline bool operator<(const Q&a,const Q&b){
if(id[a.l]!=id[b.l])return id[a.l]<id[b.l];
return (a.r<b.r)!=(id[a.l]&);
}
namespace map{
const int P=;
lint xs[P];
int ys[P],now=;
bool d[P];
int get(lint x){
int w=x%P;
while(d[w]){
if(xs[w]==x)return ys[w];
w+=;
if(w>=P)w-=P;
}
d[w]=;xs[w]=x;
return ys[w]=now++;
}
}
int yv[];
inline void inc(int x){
Ans+=yv[x]++;
}
inline void dec(int x){
Ans-=--yv[x];
}
int main(){
scanf("%d%s%d",&p,s+,&m);
l=strlen(s+);
b=double(l+)/(sqrt(m+)+)+;
for(int i=;i<=l;i++)id[i]=(i-)/b;
for(int i=;i<m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
std::sort(q,q+m);
int p10=;
if(p!=&&p!=){
for(int i=l;i;i--){
mp[i]=(mp[i+]+(s[i]-48ll)*p10)%p;
p10=p10*10ll%p;
}
for(int i=;i<=l+;i++)mp[i]=map::get(mp[i]);
}else for(int i=;i<=l;i++)mp[i]=(s[i]-)%p;
int L=,R=;
if(p!=&&p!=)
for(int i=;i<m;i++){
int l=q[i].l,r=q[i].r+;
while(L<l)dec(mp[L++]);
while(L>l)inc(mp[--L]);
while(R<r)inc(mp[++R]);
while(R>r)dec(mp[R--]);
ans[q[i].id]=Ans;
}else for(int i=,c=;i<m;i++){
int l=q[i].l,r=q[i].r;
while(L<l){
Ans-=c;
if(!mp[L++])--c;
}
while(L>l){
if(!mp[--L])++c;
Ans+=c;
}
while(R<r){
if(!mp[++R])++c,Ans+=R-L+;
}
while(R>r){
if(!mp[R--])Ans-=R-L+,--c;
}
ans[q[i].id]=Ans;
}
for(int i=;i<m;i++)printf("%lld\n",ans[i]);
return ;
}

bzoj4542 大数的更多相关文章

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

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

  2. HNOI2016(BZOJ4542) 大数

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

  3. 【bzoj4542】 Hnoi2016—大数

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

  4. BZOJ4542: [Hnoi2016]大数

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

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

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

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

    这题...离散化...$N$和$n$搞错了...查了$2h$...QAQ 考虑$s[l...r]$,可以由两个后缀$suf[l]-suf[r+1]$得到$s[l...r]$代表的数乘$10^k$得到的 ...

  7. 【bzoj4542】[Hnoi2016]大数 莫队算法

    题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...

  8. [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)

    正经题解在最下面 http://blog.csdn.net/qq_32739495/article/details/51286548 写的时候看了大神的题解[就是上面那个网址],看到下面这段话 观察题 ...

  9. 【BZOJ4542】大数(莫队)

    题意:给定一个N位的由[0..9]组成的数字串和质数P,有M次不强制在线的询问,每次询问区间[l,r]中模P意义下为0的子串个数 N,M<=2e5,P<=1e10 思路:一次A,本来还以为 ...

随机推荐

  1. 【问题解决:未找到端口号】启动报错Circular placeholder reference 'server.port' in property definitions

    问题描述: 启动spring boot项目时报错:Circular placeholder reference 'server.port' in property definitions 解决过程: ...

  2. 使用 shinydashboard

    除了 shiny 扩展包提供的函数之外,RStudio 也开发了一个 shinydashboard 扩展包 (http://rstudio.github.io/shinydashboard/),它呈现 ...

  3. CentOS下安装Python-pip

    1.安装epel-release软件包:自动配置yum的软件仓库,弥补centos内容更新有时比较滞后或是一些扩展的源没有. yum -y install epel-release 2.安装pytho ...

  4. Tornado源码分析 --- 静态文件处理模块

    每个web框架都会有对静态文件的处理支持,下面对于Tornado的静态文件的处理模块的源码进行分析,以加强自己对静态文件处理的理解. 先从Tornado的主要模块 web.py 入手,可以看到在App ...

  5. UVA-1149 Bin Packing (贪心)

    题目大意:给定n个物品的重量,无限个容量为m的箱子,每个箱子最多装两个物品,要把所有的物品都装下,最少需要多少个箱子. 题目分析:贪心策略:每次将最重和最轻的两个物品放到一个箱子里,如果装不下,则将最 ...

  6. 005——php字符串中的处理函数(四)

    <?php /** * 字符串处理函数: * parse_url 解析URL.返回其组成部分 */ /* $url="http://www.lantianwang.com/admin/ ...

  7. 转载:【Oracle 集群】RAC知识图文详细教程(八)--Oracle 11G RAC数据库安装

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  8. 彻底解决WP的TextBox中文字过长显示不出来的问题

    文字如果过长的话在TextBox中会显示不完全,这个大家都知道了,后来有人做了ExTextblock增强控件,大部分文字是可以显示出来了,不过,在某些情况下还是会有显示不全的情况. 这个时候一个解决方 ...

  9. Type Script在Visual Studio 2013中的问题汇总(持续更新…)

    TypeScript在vs2012下的问题 TypeScript对VS2012支持度比较低,建议升级为VS2013版本以上. 在VS2013中无法创建TypeScript项目 VS2013默认不支持T ...

  10. RF/GBDT/XGBoost/LightGBM简单总结(完结)

    这四种都是非常流行的集成学习(Ensemble Learning)方式,在本文简单总结一下它们的原理和使用方法. Random Forest(随机森林): 随机森林属于Bagging,也就是有放回抽样 ...