正经题解在最下面

写的时候看了大神的题解[就是上面那个网址],看到下面这段话

观察题目,发现一串数s(l~r)整除p满足s(l~n-1)%p==s(r+1~n-1)%p 
但p值为2或5不满足这个性质需要特判(不过数据中好像没有,于是笔者没写,有兴趣的可以自己去写写。。。。。。)

然后问题转化为求一段区间中有几对相等的f值。

看到这里,我感觉豁然开朗,完全忽视了离散化的要求,我以为把余数值存起来扫一遍就行了离散个p啊..

写着写着完全参透这道题之后发现离散化的是余数啊,你不离散化怎么存数量啊,不存某个余数数量硬扫肯定超时啊....

然后我暴力硬扫果然[dian]超时了.........

然后老老实实写离散化..........

 最重要的:2和5要特判
 
更重要的:离散化的时候要注意判定0的情况...即等于0时特判,不等0时离散化的赋值不应该从0开始,看加注释的那一段即可,不然会像我一样不停错两个点.....
我的程序200+大牛程序100-行..被吊着打.......我觉得我写的还挺清晰的...虽然完全不简洁
 #include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int p,m,s=,sz;
int a[]={};
int bel[]={};
int ans[]={};
long long mo[]={};
long long b[]={};
long long re[][]={};
int vis[]={};
int tot[]={};
struct nod{
int x,y;
int id;
}e[];
void readin(){
char c=getchar();
while(c<''||c>''){
c=getchar();
}
while(c>=''&&c<=''){
a[++s]=(int)(c-'');
c=getchar();
}
}
bool mmp(nod aa,nod bb){
if(bel[aa.x]==bel[bb.x]){
if(aa.y==bb.y){
return aa.x<bb.x;
}
return aa.y<bb.y;
}
return bel[aa.x]<bel[bb.x];
}
void work(){
int l=,r=;
int an=;
for(int i=;i<=m;i++){
while(l>e[i].x){
l--;
an+=vis[mo[l]];
if(mo[r+]==mo[l]){
an+=;
}
vis[mo[l]]++;
}
while(r<e[i].y){
r++;
vis[mo[r]]++;
an+=vis[mo[r+]];
}
while(l<e[i].x){
vis[mo[l]]--;
an-=vis[mo[l]];
if(mo[r+]==mo[l]){
an-=;
}
l++;
}
while(r>e[i].y){
an-=vis[mo[r+]];
vis[mo[r]]--;
r--;
}
ans[e[i].id]=an;
}
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
}
void work5(){
int l=,r=;
int an=;
for(int i=;i<=m;i++){
while(l>e[i].x){
l--;
vis[a[l]%p]++;
an+=vis[];
}
while(r<e[i].y){
r++;
vis[a[r]%p]++;
if(a[r]%p==){
an+=r-l+;
}
}
while(l<e[i].x){
an-=vis[];
vis[a[l%p]]--;
l++;
}
while(r>e[i].y){
if(a[r]%p==){
an-=r-l+;
}
vis[a[r]%p]--;
r--;
}
ans[e[i].id]=an;
}
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
}
int main(){
//freopen("wtf.in","r",stdin);
scanf("%d",&p);
readin();
sz=(int)sqrt((double)s);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&e[i].x,&e[i].y);
if(e[i].x>=s){
e[i].x=s;
}
if(e[i].y>s){
e[i].y=s;
}
e[i].id=i;
}
for(int i=;i<=s;i++){
bel[i]=(i-)/sz+;
}
sort(e+,e++m,mmp);
if(p==||p==){
work5();
return ;
}
for(int i=;i<=;i++){
re[i][]=i%p;
tot[i]=;
}
for(int i=s,w=;i>=;i--){
int x=a[i];
while(tot[x]<w){
tot[x]++;
re[x][tot[x]]=re[x][tot[x]-]*%p;
}
mo[i]=(re[x][w]+mo[i+])%p;
b[i]=mo[i];
w++;
}
sort(b+,b++s);
int size=unique(b+,b++s)-b-;
for(int i=;i<=s;i++){//离散化部分....注意一定要特判..
if(mo[i]==){
mo[i]==;
}
else{
mo[i]=lower_bound(b+,b++s,mo[i])-b;//这里-1且输入字符串中没有0时,1会被离散化为0
}
}
work();
return ;
}

[BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)的更多相关文章

  1. 【BZOJ4542】[Hnoi2016]大数 莫队

    [BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...

  2. 【bzoj4542】[Hnoi2016]大数 莫队算法

    题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...

  3. [BZOJ4542] [Hnoi2016] 大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  4. bzoj4542 [Hnoi2016]大数 莫队+同余

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...

  5. BZOJ.4542.[HNOI2016]大数(莫队)

    题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...

  6. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

  7. bzoj 4542: [Hnoi2016]大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  8. [HNOI2016]序列(莫队,RMQ)

    [HNOI2016]序列(莫队,RMQ) 洛谷  bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...

  9. 【bzoj4542】 Hnoi2016—大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...

随机推荐

  1. CodeForces - 996B

    Allen wants to enter a fan zone that occupies a round square and has nn entrances. There already is ...

  2. spring boot 自定义属性覆盖application文件属性

    参考 Spring boot源码分析-ApplicationListener应用环境: https://blog.csdn.net/jamet/article/details/78042486 加载a ...

  3. KS(Kolmogorov-Smirnov)(转)

    来源:https://blog.csdn.net/u013421629/article/details/78217498 KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估 ...

  4. Why does OpenCV use BGR color format ?【转】

    转自:http://www.learnopencv.com/why-does-opencv-use-bgr-color-format/ One of the elements of good desi ...

  5. javascript反混淆之packed混淆(一)

    javascript反混淆之packed混淆(一) 什么是JavaScript反混淆,在理解这个概念前我们先来看下什么是代码混淆,代码混淆,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理 ...

  6. Nim 游戏、SG 函数、游戏的和

    Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以 ...

  7. Freemaker如何遍历key为non-string类型的map?

    (一) 前置知识 Freemaker默认配置下会使用SimpleHash去包装后台传递的hashmap,下段摘抄自官方reference 同样,当你传递进去一个hashmap实例时,会替换为一个sim ...

  8. nginx allow 多个ip & ipv4的网段表示方法解析

    参考:https://www.baidu.com/link?url=5aVe_syihQzhHnSDAdLsNNQYqDe_W2GYG1GeIQ130e4mEZbusxQfqGVTdg-dJg8fqM ...

  9. javadoc生成word接口文档

    1.下载DocFlex/Doclet 下载地址 http://www.filigris.com/downloads/ 2.ecplise->project->generate javado ...

  10. 根据名字杀死进程Killall

    Killall命令可以用来给一个特定的进程发送一个信号.这个信号默认情况下是SIGTERM,但也可以由killall命令使用参数来指定其它信号.现在让我们通过一些实际的例子来看看这个命令的实际用法. ...