【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.小 ...
随机推荐
- Log错误日志级别
日志记录器(Logger)的级别顺序: 分为OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL或者您定义的级别.Log4j建议只使用四个级别,优先级 从高到低分别是 ERR ...
- DevOps - 部署系统 - Cobbler
Cobbler简介 Cobbler由python语言开发,是对PXE和Kickstart以及DHCP的封装.融合很多特性,提供了CLI和Web的管理形式.更加方便的实行网络安装.适用场景:需要大批量的 ...
- Python通过RabbitMQ实现RPC
Client端代码: #!/usr/bin/env python # -*- coding:utf-8 -*- import pika import uuid import time class Fi ...
- jupyter notebook(二)——修改jupyter打开默认的工作目录
1.简述 jupyter notebook,启动后,浏览器发现工作目录并不是自己真正的代码的工作路径.所以需要设置一下.这样方便自己快捷使用. 2.设置修改jupyter notebook打开后默认工 ...
- tp3.2读取time()格式遇到的的问题(尚未解决)
在用tp3.2框架做一个讲座模块.最近又遇到了一个问题 如上图所示,我把日期和讲座开始时间结束时间分来放了.(这里的Jdate2和jdate3本来存放为time(7)类型的,后发现在原来这个7是可以改 ...
- python3.7 迭代器和生成器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1.迭代器协议是指:对象 ...
- A计划 hdu2102(BFS)
A计划 hdu2102 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国 ...
- poj 1258 建光迁问题 最小生成树
题意:给全村建光纤,求花费最小 思路:最小生成树,树相对于图来说就是没有环 m用来存图 v判断是否访问 low用来存两点间的最短距离 给low赋值 for(i=1;i<=n;i++){if(i ...
- python上数据存储 .h5格式或者h5py
最近在做城市计算的项目,数据文件是以.h5的格式存储的,总结下其用法和特点 来自百度百科的简介: HDF(Hierarchical Data Format),可以存储不同类型的图像和数码数据的文件格式 ...
- N宫格
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...