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]为 2
13。N,M<=100000,P为素数
Output
输出M行,每行一个整数,第 i行是第 i个询问的答案。
Sample Input
121121
3
1 6
1 5
1 4
Sample Output
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
HINT
2016.4.19新加数据一组
#include<cstdio>
#include<cctype>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
typedef long long ll;
inline ll read() {
ll x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=100010;
int n,m,type,blo[maxn];
char s[maxn];
ll p,ans[maxn],tmp[maxn],A[maxn],nowans;
struct Query {
int l,r,id;
bool operator < (const Query& ths) const {
if(blo[l]!=blo[ths.l]) return l<ths.l;
return r<ths.r;
}
}Q[maxn];
int c[maxn],l=1,r,k;
void Add(int x) {nowans+=c[x];c[x]++;}
void Del(int x) {c[x]--;nowans-=c[x];}
void Addl(int x) {if(x%p==0) k++;nowans+=k;}
void Addr(int x) {if(x%p==0) k++,nowans+=(r-l+1);}
void Dell(int x) {nowans-=k;if(x%p==0) k--;}
void Delr(int x) {if(x%p==0) k--,nowans-=(r-l+2);}
void solve() {
sort(Q+1,Q+m+1);
if(type) {
ll t=1;
dwn(i,n,1) {
A[i]=(A[i+1]+t*(s[i]-'0'))%p;
(t*=10)%=p;
}
rep(i,1,n+1) tmp[i]=A[i];
sort(tmp+1,tmp+n+2);
rep(i,1,n+1) A[i]=lower_bound(tmp+1,tmp+n+2,A[i])-tmp;
rep(i,1,m) {
while(l>Q[i].l) Add(A[--l]);
while(r<Q[i].r) Add(A[++r]);
while(l<Q[i].l) Del(A[l++]);
while(r>Q[i].r) Del(A[r--]);
ans[Q[i].id]=nowans;
}
}
else rep(i,1,m) {
while(l>Q[i].l) Addl(s[--l]-'0');
while(r<Q[i].r) Addr(s[++r]-'0');
while(l<Q[i].l) Dell(s[l++]-'0');
while(r>Q[i].r) Delr(s[r--]-'0');
ans[Q[i].id]=nowans;
}
rep(i,1,m) printf("%lld\n",ans[i]);
}
int main() {
p=read();scanf("%s",s+1);n=strlen(s+1);
m=read();int SIZE=(int)sqrt(n);
rep(i,1,n) blo[i]=(i-1)/SIZE+1;
if(p!=2&&p!=5) type=1;
if(type) rep(i,1,m) Q[Q[i].id=i].l=read(),Q[i].r=read()+1;
else rep(i,1,m) Q[Q[i].id=i].l=read(),Q[i].r=read();
solve();
return 0;
}
BZOJ4542: [Hnoi2016]大数的更多相关文章
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj4542: [Hnoi2016]大数(莫队)
这题...离散化...$N$和$n$搞错了...查了$2h$...QAQ 考虑$s[l...r]$,可以由两个后缀$suf[l]-suf[r+1]$得到$s[l...r]$代表的数乘$10^k$得到的 ...
- 【莫队】bzoj4542: [Hnoi2016]大数
挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...
- bzoj4542 [Hnoi2016]大数 莫队+同余
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- HNOI2016(BZOJ4542) 大数
HNOI2016 Day2 T3 大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P ...
- 【bzoj4542】 Hnoi2016—大数
http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...
随机推荐
- C-线性顺序表的增删改查
闲来无事,练练手,写点C代码,对于线性表的简单操作.编辑工具Notpad++,编译工具tcc. /* *the sequence of the list *author:JanneLee *data: ...
- java compiler level does not match the version of the installed java project
修改:工程/.settings/”目录下找到名为 org.eclipse.wst.common.project.facet.core.xml
- android 入门-android Studio 配置
重要:sdk 最好先有一个版本 19版本.build-tools 19.1.0 extras 19.0和platforms android-19 1.下载android sdk 和jdk 并配置环境变 ...
- 怎样打开64位 Ubuntu 的32位支持功能?
转自:http://jingyan.baidu.com/article/7082dc1c539c15e40a89bd3e.html 大多数使用基于 Ubuntu/Debian 的发行版的人都更倾向于选 ...
- ok6410,mmu,内存管理
MMU 一.MMU学习 MMU其实就是一个页表.将虚拟地址通过查表的方式,对应到物理地址去他由一个或一组芯片组成,一般存在与协处理器中. 1.将虚拟地址转化为物理地址 2.访问权限管理 1.1得出mm ...
- 实现一种快速查找Richedit中可见区域内OLE对象的方法
Richedit是一个OLE容器,使用Richedit来显示IM聊天内容时,通常使用OLE对象来实现在Richedit中播放表情动画. 触发表情的绘制有两种途径: 1.来自Richedit的刷新消息. ...
- 解释一下SQLSERVER事务日志记录
解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...
- 函数fseek() 用法(转)
在阅读代码时,遇到了很早之前用过的fseek(),很久没有用了,有点陌生,写出来以便下次查阅. 函数功能是把文件指针指向文件的开头,需要包含头文件stdio.h fseek 函数名: fseek ...
- MyBatis入门案例 增删改查
一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...
- Liferay 6.2 改造系列之二十二:如何发布WAR包
1.修改web资源并发布 如果修改了默认主题信息,需执行portal-web中的build-themes任务: 执行portal-web中的deploy任务: 2.修改portal-impl中的jav ...