【BZOJ4542】大数(莫队)
题意:给定一个N位的由[0..9]组成的数字串和质数P,有M次不强制在线的询问,每次询问区间[l,r]中模P意义下为0的子串个数
N,M<=2e5,P<=1e10
思路:一次A,本来还以为要调好长时间……
考虑类似于字符串哈希的思路,预处理出每个后缀在模P意义下的余数,设从第i位到第N位的后缀的值为s[i]
[L,R]这段区间的值*10^(N-R)=s[L]-s[R+1]
特判P=2和P=5,因为是10进制只需要考虑最后一位能被整除,对于每一个询问计算每一位的贡献做前缀和即可
P取其他值时质数10^(N-R)与P必定互质,所以若[L,R]这段的值能被P整除,则s[L]-s[R+1]必定需要被P整除
取模后等价于[L,R+1]一段数字中相等数字对数,是经典的莫队
莫队部分好像都是先写扩大区间部分再写缩小区间部分的
条件允许的话还是要把所有细节想清楚了再写,效率会高很多
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
#define N 210000 struct node
{
int x,y,id;
}c[N]; ll a[N],b[N],s[N],ans[N],pos[N],A[N];
char ch[N];
int n,m; bool cmp(node a,node b)
{
if(pos[a.x]==pos[b.x]) return a.y<b.y;
return a.x<b.x;
} void init()
{
int block=int(sqrt(N));
for(int i=;i<=N;i++) pos[i]=(i-)/block+;
} void solve()
{
memset(s,,sizeof(s));
ll tmp=;
int nowx=;
int nowy=;
for(int i=;i<=m;i++)
{
while(nowx>c[i].x)
{
tmp+=s[a[nowx-]];
s[a[nowx-]]++;
nowx--;
}
while(nowy<c[i].y)
{
tmp+=s[a[nowy+]];
s[a[nowy+]]++;
nowy++;
}
while(nowx<c[i].x)
{
s[a[nowx]]--;
tmp-=s[a[nowx]];
nowx++;
}
while(nowy>c[i].y)
{
s[a[nowy]]--;
tmp-=s[a[nowy]];
nowy--;
}
ans[c[i].id]=tmp;
}
} int main()
{
ll MOD;
scanf("%lld",&MOD);
scanf("%s",ch+);
n=strlen(ch+);
if(MOD==||MOD==)
{
for(int i=;i<=n;i++)
if((ch[i]-'')%MOD==)
{
a[i]=i; b[i]=;
}
a[]=b[]=;
for(int i=;i<=n;i++)
{
a[i]+=a[i-];
b[i]+=b[i-];
}
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ll ans=a[y]-a[x-]-1ll*(b[y]-b[x-])*(x-);
printf("%lld\n",ans);
}
return ;
}
a[n+]=;
ll mi=;
for(int i=n;i>=;i--)
{
a[i]=(a[i+]+(ch[i]-'')*mi)%MOD;
mi=mi*%MOD;
}
n++;
for(int i=;i<=n;i++) A[i]=a[i];
sort(A+,A+n+);
A[]=unique(A+,A+n+)-A-;
for(int i=;i<=n;i++) a[i]=lower_bound(A+,A+A[]+,a[i])-A;
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&c[i].x,&c[i].y);
c[i].y++;
c[i].id=i;
}
init();
sort(c+,c+m+,cmp);
solve();
for(int i=;i<=m;i++) printf("%lld\n",ans[i]);
return ;
}
【BZOJ4542】大数(莫队)的更多相关文章
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- bzoj4542 [Hnoi2016]大数 莫队+同余
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)
正经题解在最下面 http://blog.csdn.net/qq_32739495/article/details/51286548 写的时候看了大神的题解[就是上面那个网址],看到下面这段话 观察题 ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 【莫队】bzoj4542: [Hnoi2016]大数
挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...
随机推荐
- pycharm永久激活记录
由于上一年安装的pycharm激活时是用的激活码,有期限的,一直到今年5月4日过期,这两天顺便把版本也更新到最新,一直用的free版,到今天提醒我free快到期了,所以才狠下心来去找解决方案,目前已经 ...
- git提交时报错 permission denied
git push 时报错:permission denied xxx 目前很多解决办法是生成公钥和秘钥,这种方法安全可靠,比较适用于一台电脑对应一个git账户,但是多个账户在同一台电脑上提交使用git ...
- 【转载】MQTT的学习之Mosquitto集群搭建
本文出自:http://www.cnblogs.com/yinyi521/p/6087215.html 文章钢要: 1.进行双服务器搭建 2.进行多服务器搭建 一.Mosquitto的分布式集群部署 ...
- stm32之PWM博客好文收藏
https://www.cnblogs.com/jiwangbujiu/p/5616376.html STM32F103 使用TIM3产生四路PWM https://www.cnblogs.com/c ...
- UVA_1025 a Spy in the Metro 有向无环图的动态规划问题
应当认为,有向无环图上的动态规划问题是动态规划的基本模型之一,对于某个模型,如果可以转换为某一有向无环图的最长.最短路径问题,则可以套用动态规划若干方法解决. 原题参见刘汝佳紫薯267页. 在这个题目 ...
- LeetCode刷题感想
断断续续用了半年的时间把LeetCode刷完了,之前复习了数据结构与算法.将刷题与复习数据结构结合起来会更有效果.总之不是为了刷题而刷题,而是为了巩固和补充一部分知识. LeetCode真的是一个很好 ...
- python项目中输出指定颜色的日志
起因 在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想 ...
- hadoop ha集群搭建
集群配置: jdk1.8.0_161 hadoop-2.6.1 zookeeper-3.4.8 linux系统环境:Centos6.5 3台主机:master.slave01.slave02 Hado ...
- Java多线程-join方法
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. 具体例子看链接 ...
- 图文详解安装PHP运行环境
一.什么是PHP运行环境 能够理解人与计算机交流时语言软件,通常指解释PHP编程语言的软件. 例如: PHP(代码) 需要PHP超文本预编译器(软件). Java需要JVM虚拟机 二.安装PHP运行环 ...