[HNOI2016]大数
题目描述
小 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的倍数。
输入输出格式
输入格式:
第一行一个整数: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为素数
输出格式:
输出M行,每行一个整数,第 i行是第 i个询问的答案。
输入输出样例
11
121121
3
1 6
1 5
1 4
5
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
说明
2016.4.19新加数据一组
把每一个后缀i~n的值%p算出来lst[i]
一个子串整除p满足:lst[i]=lst[j+1] (j>=i)
所以用莫队处理询问,每一次移动都是很好计算的
r向右走一步,相当于加上当前与lst[++r]相同的值ss[lst[++r]],在ss[lst[++r]]++
r向左走一步,相当于减去当前与lst[r]相同的值ss[lst[r]]--,再把r--
l相似
注意上面的条件和下面的莫队处理的都是lst[i]=lst[j+1],所以要把询问的右端点+1
还有要注意的,当p=2或p=5时要特判(不这样对不了)
这两个素数比较特殊
只要i能整除p,那么所有j~i都能整除p
用ss[]表示 前缀有多少个可以被p整除的子串 ls[]表示有多少个可以被P整除的数 求区间多少个子串的时候用ss[r]-ss[l-1]-(l-1中整除p对区间l~r的贡献)
=ss[r]-ss[l-1]-(l-1)*(ls[r]-ls[l-1])
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
struct Ask
{
ll id,l,r;
}q[];
ll sqn,m,n,lst[],ls[],ans[];
ll ss[];
map<ll,ll>Map;
char s[];
bool cmp(Ask a,Ask b)
{
if (a.l/sqn==b.l/sqn)
return a.r<b.r;
return a.l/sqn<b.l/sqn;
}
ll p;
int main()
{ll bt,i,l,r;
cin>>p;
cin>>s+;
cin>>m;
n=strlen(s+);
sqn=sqrt(n);
bt=;
if (p!=&&p!=)
{
for (i=n;i>=;i--)
{
bt=bt*%p;
lst[i]=(lst[i+]+(s[i]-'')*bt)%p;
ls[i]=lst[i];
}
sort(ls+,ls+n+);
for (i=;i<=n+;i++)
Map[ls[i]]=i;
for (i=;i<=n+;i++)
lst[i]=Map[lst[i]];
for (i=;i<=m;i++)
{
scanf("%lld%lld",&q[i].l,&q[i].r);
q[i].r++;
q[i].id=i;
}
sort(q+,q+m+,cmp);
int l=,r=;
long long cnt=;
for (i=;i<=m;i++)
{
while (r<q[i].r) cnt+=ss[lst[++r]]++;
while (r>q[i].r) cnt-=--ss[lst[r--]];
while (l>q[i].l) cnt+=ss[lst[--l]]++;
while (l<q[i].l) cnt-=--ss[lst[l++]];
ans[q[i].id]=cnt;
}
for (i=;i<=m;i++)
printf("%lld\n",ans[i]);
}
else
{
for (i=;i<=n;i++)
if (!((s[i]-'')%p))
ss[i]=ss[i-]+,ls[i]=ls[i-]+i;
else ss[i]=ss[i-],ls[i]=ls[i-];
for (i=;i<=m;i++)
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",ls[r]-ls[l-]-(ss[r]-ss[l-])*(l-));
}
}
}
[HNOI2016]大数的更多相关文章
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- BZOJ4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
随机推荐
- 记录python接口自动化测试--主函数(第六目)
把操作excel的方法封装好后,就可以用准备好的接口用例来循环遍历了 我的接口测试用例如下 主函数代码: run_handle_excel.py# coding:utf-8 from base.run ...
- 结对作业NO.2
结对NO.2 1. 引言 1.1 项目地址 github 生成的一组好数据 1.2 项目简介 按照老师给的项目要求:"编码实现一个部门与学生的智能匹配的程序".由于数据需要自己生成 ...
- Beta冲刺合集
Beta冲刺序列: Beta凡事预则立 :Beta No.0 Beta冲刺Day1:Beta No.1 Beta冲刺Day2:Beta No.2 Beta冲刺Day3:Beta No.3 Beta冲刺 ...
- 第二次作业:APP案例分析
App案例分析 产品:三国杀-页游手游双通 选择理由 当今社会手机已经渐渐取代了电脑在人们日常生活的需求,既然要选择APP进行案例分析,首推的估计就是手机APP了.三国杀是陪伴我高中时代的主要娱乐方式 ...
- Flask 页面缓存逻辑,jinja2 过滤器,测试器
回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...
- 【bug清除】Surface Pro系列使用Drawboard PDF出现手写偏移、卡顿、延迟现象的解决方式
最近自己新买的New Surface Pro在使用Drawboard PDF时,出现了性能问题,即笔迹延迟偏移,卡顿的问题. 排查驱动问题之后,确认解决方案如下: 将Surface的电池调到性能模式, ...
- B树和B+树的插入、删除图文详解
简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...
- OpenShift实战(二):OpenShift节点扩容
1.新增节点信息 增加节点如下,请将xxx改为自己的域名 node6.xxx.net Node 192.168.8.90 8G 20G/60G 4C node7.xxx.net Node 192.16 ...
- MySQL关系表查询两个表的数据
如下,有四张表:游戏类型表,游戏表,点卡和游戏关系表,点卡表 CREATE TABLE `gamesType`( `tId` INT AUTO_INCREMENT NOT NULL PRIMARY K ...
- c 语言常量
1,整数常量 整数常量可以是十进制.八进制或十六进制的常量.前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制. 整数常量也可以带一个后缀,后缀是 U 和 L 的组合 ...