【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.小 ...
随机推荐
- 新装Ubuntu后的一些配置
一:Ubuntu 16.04 开启root用户和使用root用户登陆 1. 编辑/etc/lightdm/lightdm.conf autologin-guest=false autologin-us ...
- jrtplib移植
jrtplib版本:3.11.1 jthread版本:1.3.3 libsrtp版本:1.6.0 jrtplib库有两种编译方式: 1. 使能jthread编译,此方式可使jrtplib自动在后台轮询 ...
- 【luogu题解】P1546 最短网络 Agri-Net
题目 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并 ...
- DiyCode开源项目 AboutActivity分析
1.首先看一下效果 这是手机上显示的效果: 1.1首先是一个标题栏,左侧一个左箭头,然后一个图标. 1.2然后下方是一个可以滑动的页面. 1.3分成了7个部分. 1.4DiyCode的图标. 1.5然 ...
- #include "*.c"文件的妙用
在看uCOS II V2.91版本源代码时,在ucos_ii.c源文件中发现下面的代码: #include <os_core.c> #include <os_flag.c> # ...
- sql优化系列3(收集来源http://bbs.csdn.net/topics/250004467)
如何加快查询速度? 1.升级硬件 2.根据查询条件,建立索引,优化索引.优化访问方式,限制结果集的数据量. 3.扩大服务器的内存 4.增加服务器CPU个数 5.对于大的数据库不要设置数据库自动增长 ...
- HDU 2177 取(2堆)石子游戏
取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- B树、B-树、B+树、B*树之间的关系
https://blog.csdn.net/u013411246/article/details/81088914
- Delphi字符串处理函数
1.Copy 功能说明:该函数用于从字符串中复制指定范围中的字符.该函数有3个参数.第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(即个数) ...
- python2.X中文乱码
在IDE下,加上# -- coding: UTF-8 -- 并且保证IDE也是utf-8编码. 在CMD下,这样执行会有乱码,为啥呢,因为cmd下是gbk编码的,你写的代码必须也是gbk编码的,你可以 ...