正解:莫队

解题报告:

传送门

这题首先要发现一个结论,是这样儿的:

若p不是10的约数(即2和5) 时,当第i位到第n位组成的数%p==第j位到第n位组成的数%p,那么第i位到第j位上的数组成的数%p=0

试证如下:

记后缀数组num[i]:第i位到第n位构成的数,dat[i,j]:第i位到第j位构成的数

那么可以表示出dat[i,j-1]=(num[j]-num[i])*10j-i

因为现在已知num[i]=num[j]了,所以dat[i,j-1]=0

(显然指的是%p意义下昂QAQ

所以可以先预处理出后缀数组,于是问题就变成了这样:

有一些询问,每个询问给定一个区间,求区间内相同元素的数量

这不就是,莫队经典板子题了嘛,,,然后就做完了QAQ

然后以上都是我们在p不是10的约数的情况下讨论的(因为当p是10的约数时可能有更多QAQ

但是考虑到p是10的约数就只可能p=2或p=5嘛,然后2和5的倍数的性质又特别明显——尾数484倍数,所以直接前缀和就好辣QAQ

具体等下放代码QAQ

然后关于实现,并不很难和莫队普通题都差不多

唯一一个要注意的是这样儿的:

对于[l,r],因为计算的是[l,r]之间的数,所以实际上的那个num是要算到r+1的,但是同时要注意的是,r+1是不能计入数量的,而且在统计完答案之后还要把ans中的关于r+1多计算的减回来

但是想到这儿还要想到一个细节

就是当给定的r到达最右端的时候,如果依然按照上面的套路来会有问题,因为那样加上的会是0的数量,但是在离散化之后最小的数都是1

所以认真想想可以发现最右端的右边的贡献其实就是0的贡献,然后就想到怎么求0的离散化之后的值,显然在排序之后要么就是麻油0要么就是0离散化之后=1,分类讨论一下就好

表述不太清晰感觉,,,所以单独放一下这段的代码趴QAQ

(然后其实我好像做复杂了,,,因为我看到好像别人都麻油分类讨论什么的,,,直接一视同仁地做过去就欧克了,,,估计是前面有什么处理不一样,但是我jio得也就多打几句话而已,所以就懒得再修改了QAQ

if(r!=str_lth-)ret+=num[dat[r+]];else if(st[]==)ret+=num[];
as[ques[i].id]=ret;if(r!=str_lth-)ret-=num[dat[r+]];else if(st[]==)ret-=num[];

其实也就两句而已QAQ

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define ll unsigned long long
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const ll M=+,N=+;
ll p,m,str_lth,sq_lth,dat[N],st[N],tot,num[N],as[M],sum[N];
string str;
struct qs{ll l,r,id;}ques[M]; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(qs gd,qs gs){return gd.r/sq_lth==gs.r/sq_lth?gd.l<gs.l:gd.r<gs.r;}
il void wk1()
{
string str;cin>>str;str=' '+str;str_lth=str.length();sq_lth=sqrt(str_lth);ll tmp=;
my(i,str_lth-,)st[i]=dat[i]=(dat[i+]+tmp*(str[i]^''))%p,tmp=tmp*%p;
sort(st+,st+str_lth+);tot=unique(st+,st+str_lth+)-st;rp(i,,str_lth-)dat[i]=lower_bound(st+,st+tot,dat[i])-st;
m=read();rp(i,,m)ques[i]=(qs){read(),read(),i};sort(ques+,ques++m,cmp);ll ret=,l=ques[].r+,r=ques[].r;
rp(i,,m)
{
while(l>ques[i].l)ret+=num[dat[--l]]++;
while(r<ques[i].r)ret+=num[dat[++r]]++;
while(l<ques[i].l)ret-=--num[dat[l++]];
while(r>ques[i].r)ret-=--num[dat[r--]];
if(r!=str_lth-)ret+=num[dat[r+]];else if(st[]==)ret+=num[];
as[ques[i].id]=ret;if(r!=str_lth-)ret-=num[dat[r+]];else if(st[]==)ret-=num[];
}
rp(i,,m)if(as[i])printf("%lld\n",as[i]);else printf("0\n");
}
il void wk2()
{
string str;cin>>str;str=' '+str;str_lth=str.length();m=read();rp(i,,m)ques[i]=(qs){read(),read(),i};
rp(i,,str_lth)dat[i]=(str[i]^'')%p,st[i]=st[i-]+(dat[i]==),sum[i]=sum[i-]+(dat[i]==)*i;
rp(i,,m)printf("%lld\n",sum[ques[i].r]-sum[ques[i].l-]-(ques[i].l-)*(st[ques[i].r]-st[ques[i].l-]));
} int main()
{
p=read();if(p!= && p!=)wk1();else wk2();
return ;
}

最后放下这个题目的代码!

洛谷P3245 大数 [HNOI2016] 莫队的更多相关文章

  1. 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线

    正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...

  2. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...

  3. 洛谷 P4396 (离散化+莫队+树状数组)

    ### 洛谷P4396  题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...

  4. 洛谷P4396 作业 [AHOI2013] 莫队

    正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...

  5. 洛谷 P2056 采花 - 莫队算法

    萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以 ...

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

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

  7. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...

  8. 【bzoj5452】[Hnoi2016]大数(莫队)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4542 首先若p=2,5则这题就是道傻逼题,前缀和搞一下没了.如果p为其他质数,那么可以 ...

  9. 洛谷P3628 [APIO2010]特别行动队(动态规划,斜率优化,单调队列)

    洛谷题目传送门 安利蒟蒻斜率优化总结 由于人是每次都是连续一段一段地选,所以考虑直接对\(x\)记前缀和,设现在的\(x_i=\)原来的\(\sum\limits_{j=1}^ix_i\). 设\(f ...

随机推荐

  1. Tomcat配置多个域名绑定到不同项目

    <Host name="www.dn-serve.com" appBase="webapps" unpackWARs="true" a ...

  2. 从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同

    例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域. read_image (Tu, 'C:/Users/xiahu ...

  3. halcon区域运算

    区域运算: Ø 并:union1().union2(): Ø 交:intersection(); Ø 差:difference(); Ø 补:complement():

  4. plsql常用方法-转

    在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLI ...

  5. Linux磁盘概念及其管理工具fdisk

    Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区  作者:chawan [字体:大 中 小]   引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...

  6. linux环境中,top命令中,对command的命令进行扩展查看详情?

    需求说明: 在使用top命令进行资源情况使用查看时,经常出现以下情况: 备注:也就是说,在COMMAND列中,有多个java进程,想要知道每个java具体的对应的是哪个程序的进程. 通过top命令的c ...

  7. Java Annotation 应用 -- 导出Excel表格

    相关知识链接: Introspector(内省) POI 1.声明注解 package com.ciic.component.excel; import java.lang.annotation.El ...

  8. echarts - 使用echarts过程中遇到的问题(pending...)

    1. 配合tab切换时,被display:none的元素init设置echarts失败 2018-11-09  18:09:35 现象描述:有一个tabs选项卡,每个切换项A.B中都有使用echart ...

  9. Java实现五子棋

    代码: package com.hotusm.datastructure.list; import com.hotusm.datastructure.Log; /** * @author luqiba ...

  10. HashMap和Hashtable的区别 2

    导读: 1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null k ...