【bzoj4542】 Hnoi2016—大数
http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接)
题意
给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r]$的子串中能被$P$整除的个数。
Solution
如果$[l,n]$的余数与$[r+1,n]$的余数相等,那么子串$[l,r]$就可以被整除,这很显然,然后问题就转化为了莫队板子,转移hash一下维护个数就好。然而为什么转移不能统一啊!强迫症看着有种想死的冲动啊!
UPD:离散化以后用数组就可以实现转移统一了,++,--真尼玛好用。
当$P=2,5$的时候我们需要特判,因为这时$x*10%P==0$,这种情况我们也很好做,直接开个计数器记录一下$0,5$或者$0,2,4,6,8$的个数就可以了。
细节
边界
代码
// bzoj4542
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define HAS 40007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
int n,m,P,S,pos[maxn];
LL sum,ans[maxn];
char s[maxn];
struct ask {int l,r,id;}q[maxn]; bool cmp(ask a,ask b) {
return pos[a.l]==pos[b.l] ? a.r<b.r : pos[a.l]<pos[b.l];
}
namespace zyt {
struct chain {int w,cnt,next;}c[maxn];
int bin[maxn],f[maxn],head[HAS],cnt;
void push(int x,int val) {
for (int i=head[x%HAS];i;i=c[i].next)
if (c[i].w==x) {c[i].cnt+=val;return;}
c[++cnt]=(chain){x,val,head[x%HAS]},head[x%HAS]=cnt;
}
int query(int x) {
for (int i=head[x%HAS];i;i=c[i].next) if (c[i].w==x) return c[i].cnt;
return 0;
}
void update1(int l,int r) {push(f[r],1);sum+=query(f[r+1]);}
void update3(int l,int r) {sum-=query(f[r+2]);push(f[r+1],-1);}
void update2(int l,int r) {push(f[r+1],1);sum+=query(f[l]);push(f[r+1],-1);push(f[l],1);}
void update4(int l,int r) {push(f[r+1],1);push(f[l-1],-1);sum-=query(f[l-1]);push(f[r+1],-1);}
void main() {
bin[0]=1;
for (int i=1;i<=n;i++) bin[i]=(LL)bin[i-1]*10%P;
for (int i=n;i>=1;i--) f[i]=((LL)(s[i]-'0')*bin[n-i]+f[i+1])%P;
sum=0;
for (int l=1,r=0,i=1;i<=m;i++) {
for (;r<q[i].r;r++) update1(l,r+1);
for (;l>q[i].l;l--) update2(l-1,r);
for (;r>q[i].r;r--) update3(l,r-1);
for (;l<q[i].l;l++) update4(l+1,r);
ans[q[i].id]=sum;
}
for (int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}
}
namespace ZYT {
void main() {
sum=0;int cnts=0;
for (int l=1,r=0,i=1;i<=m;i++) {
for (;r<q[i].r;r++) if ((s[r+1]-'0')%P==0) sum+=r-l+2,cnts++;
for (;r>q[i].r;r--) if ((s[r]-'0')%P==0) sum-=r-l+1,cnts--;
for (;l>q[i].l;l--) {if ((s[l-1]-'0')%P==0) cnts++;sum+=cnts;}
for (;l<q[i].l;l++) {sum-=cnts;if ((s[l]-'0')%P==0) cnts--;}
ans[q[i].id]=sum;
}
for (int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}
}
int main() {
scanf("%d",&P);
scanf("%s",s+1);
n=strlen(s+1);
S=(int)sqrt(n);
scanf("%d",&m);
for (int i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
for (int i=1;i<=n;i++) pos[i]=(i-1)/S+1;
sort(q+1,q+1+m,cmp);
if (P!=2 && P!=5) zyt::main();
else ZYT::main();
return 0;
}
【bzoj4542】 Hnoi2016—大数的更多相关文章
- BZOJ4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [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 ...
随机推荐
- JavaScript学习笔记(八)—— 补
第九章 最后的补充 一.Jquery简单阐述 JQuery是一个JavaScript库,旨在减少和简化处理DOM和添加视觉效果的JavaScript代码:使用时必须得添加库路径:学习路径:http:/ ...
- 使用FFMPEG 压缩png图片 与tinypng压缩结果对比
Tinypng https://tinypng.com/ 一个在线png压缩工具 FFmpeg https://ffmpeg.org/download.html 原图 903 kb Tinypng压 ...
- [shell] 脚本之shift和getopts (转载)
转载地址:http://www.361way.com/shell-shift-getopts/4973.html 建议不熟悉getopts的朋友,此篇要看完,getopts部分内容在原作者上面有改动. ...
- 一次ajax调用,发送了两次请求(一次为请求方法为option,一次为正常请求)
在项目了开发时遇见一个奇怪的现象,就是我在js里面发送一次ajax请求,在浏览器network那边查询到的却是发送了两次请求,第一次的Request Method参数为OPTIONS,第二次的Requ ...
- Bing词典vs有道词典比对测试报告——体验篇之成长性及用户控制权
成长性: 会记住曾经查询过的单词或例句与有道词典实现基本一样,并无特别亮点. 用户有控制权: 必应词典和有道词典都能实现基本的查询前进和后退.以及无法查找结果,能顺利进行反馈. 我们在输入完单词按下回 ...
- No.1_NABCD模型分析
Reminder 之 NABCD模型分析 定位 多平台的闹钟提醒软件. 在安卓市场发布软件,发布后一周的用户量为1000. N (Need 需求) 这个 ...
- Teamwork(The fifth day of the team)
在前面几天的努力中,我们已经完成了一些自己的工作,还有的就是一些完善,因为在前段时间一直都在寻找和配置Eclipse+Android SDK,由于版本和一些网络的阻碍,总是不能如愿的很好完成,经过了一 ...
- Web应用程序的基本安全实践
创建安全Web应用程序的主题非常广泛.它需要研究以了解安全漏洞.您还需要熟悉Windows..NET框架和ASP.NET的安全设施.最后,有必要了解如何使用这些安全特性来对付威胁. 即使您没有安全方面 ...
- 19_集合_第19天(List、Set)_讲义
今日内容介绍 1.List接口 2.Set接口 3.判断集合唯一性原理 非常重要的关系图 xmind下载地址 链接:https://pan.baidu.com/s/1kx0XabmT27pt4Ll9A ...
- Profibus基础知识学习——报文
转自:http://bbs.ednchina.com/BLOG_ARTICLE_3031246.HTM Profibus DP通讯协议简单介绍 一. 首先,Profibus DP通讯协议是一种单一的. ...