【BZOJ4542】[Hnoi2016]大数

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]为 213。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。

题解:看到题容易想到用莫队。用sum[i]表示S的前i位组成的数%P的值,那么如果i...j能组成一个%P=0的数,意味着

$sum[j]-sum[i]*10^{j-i}=0(mod P) \rightarrow sum[j]*10^{-j}=sum[i]*10^{-i} (mod P)$

所以离散化一下,然后就变成了问一个区间中有多少对相同数,的用桶+莫队即可。

注意特判P=2,P=5的情况!因为上式不再成立!具体方法是直接判断哪些串的末尾的数能被2和5整除即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=100010;
int B,P,n,m,nm;
char str[maxn];
int v[maxn],s[maxn];
ll sum,ans[maxn];
ll s1[maxn],s2[maxn];
struct node
{
int val,org;
}p[maxn];
struct query
{
int l,r,org;
}q[maxn];
bool cmpp(node a,node b)
{
return a.val<b.val;
}
bool cmpq(query a,query b)
{
return (a.l/B==b.l/B)?(a.r<b.r):(a.l/B<b.l/B);
}
int main()
{
scanf("%d%s%d",&P,str,&m),n=strlen(str);
int i,l,r;
if(P==2||P==5)
{
for(i=1;i<=n;i++)
{
s1[i]=s1[i-1],s2[i]=s2[i-1];
if((str[i-1]-'0')%P==0) s1[i]+=i,s2[i]++;
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
printf("%lld\n",s1[r]-s1[l-1]-(l-1)*(s2[r]-s2[l-1]));
}
return 0;
}
p[0].val=0;
for(i=1;i<=n;i++) p[i].val=(10ll*p[i-1].val+str[i-1]-'0')%P,p[i].org=i;
ll tmp=1;
for(i=n;i>=1;i--,tmp=tmp*10%P) p[i].val=tmp*p[i].val%P;
sort(p,p+n+1,cmpp);
for(i=0;i<=n;i++)
{
if(!i||p[i].val>p[i-1].val) nm++;
v[p[i].org]=nm;
}
B=int(sqrt(double(n)));
for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].l--,q[i].org=i;
sort(q+1,q+m+1,cmpq);
l=1,r=0;
for(i=1;i<=m;i++)
{
while(l>q[i].l) l--,sum+=s[v[l]],s[v[l]]++;
while(l<q[i].l) s[v[l]]--,sum-=s[v[l]],l++;
while(r<q[i].r) r++,sum+=s[v[r]],s[v[r]]++;
while(r>q[i].r) s[v[r]]--,sum-=s[v[r]],r--;
ans[q[i].org]=sum;
}
for(i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}

【BZOJ4542】[Hnoi2016]大数 莫队的更多相关文章

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

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

  2. bzoj4542 [Hnoi2016]大数 莫队+同余

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...

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

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

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

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

  5. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

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

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

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

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

  8. [HNOI2016]序列(莫队,RMQ)

    [HNOI2016]序列(莫队,RMQ) 洛谷  bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...

  9. 【莫队】bzoj4542: [Hnoi2016]大数

    挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...

随机推荐

  1. 粗谈CDN

    CDN:内容分发网络(content delivery network) 1.DNS解析到最快(有可能是地理上最近,也有可能是地理上远但是链路最好)的CDN缓存设备 2.从CDN获取已经缓存的资源 3 ...

  2. 安装Webmin1.860(RPM方式)

    Webmin是基于web的功能强大的管理工具,管理员可以通过Webmin以图文方式方便的管理CentOS 7系统.本文介绍如何在CentOS 7中安装Webmin. 1.去官网获取最新的RPM链接 2 ...

  3. 为什么实现Serializbale接口就能够进行序列化?

    从所周知,Serializbale接口是个空的接口,并没有定义任何方法.那么问题来了,为什么需要序列化的接口只要实现Serializbale接口就能够进行序列化? 这要从序列化过程的源码说起.举个例子 ...

  4. Win7 Visual Studio 2008如何注册

    默认是90天试用   在控制面板中卸载程序,然后找到VS2008,点击卸载/更改   到这一步就不要动了   去下载并运行CrackVS2008ForWindows7,然后点击右上角的Bug微软,弹出 ...

  5. VS中c++文件调用c 函数 ,fatal error C1853 预编译头文件来自编译器的早期版本号,或者预编译头为 C++ 而在 C 中使用它(或相反)

    出现错误:error C1853: "Debug\ConsoleApplication1.pch"预编译头文件来自编译器的早期版本号.或者预编译头为 C++ 而在 C 中使用它(或 ...

  6. flask和pymongo的完美搭配

    1.如何进行mongo数据库的链接 import pymongo client = pymongo.MongoClient(host='192.168.*.*', port=27017,) db_au ...

  7. 读jQuery源码之整体框架分析

    读一个开源框架,大家最想学到的就是设计的思想和实现的技巧.最近读jQuery源码,记下我对大师作品的理解和心得,跟大家分享,权当抛砖引玉. 先附上jQuery的代码结构. (function(){ / ...

  8. rational rose画UML图

    原文见:http://blog.csdn.net/cjr15233661143/article/details/8532997 UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统 ...

  9. Android布局中 android:layout_gravity="bottom"为何不起作用?

    在android布局时我们有时会需要将位于LinearLayout布局中的控件放在布局底部,或者是同时想将几个控件底部对齐,此时我们自然会想到使用 android:layout_gravity=&qu ...

  10. eclipse下构建maven spring项目

    准备工作: 1.下载eclipse(Eclipse Java EE IDE for Web Developers,Version: Juno Service Release 2). 2.下载maven ...