正解:莫队

解题报告:

传送门

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

若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. 关于Unity中NGUI的Pivot和锚点

    Pivot 1.创建一个Sprite类型的Sprite1节点,关联一个图集和一张贴图,用图中的六个按钮调整这个贴图的Pivot点,一共有八个点可以选择 2.再创建一个Sprite类型的Sprite2节 ...

  2. Ubuntu 设置NAT共享网络(命令行方法)

    本文介绍如何使用iptables来实现NAT转发,事实上就是将一台机器作为网关(gateway)来使用.我们假设充当网关的机器至少有网卡eth0和eth1,使用eth0表示连接到外网的网卡,使用eth ...

  3. Spark学习笔记——数据读取和保存

    spark所支持的文件格式 1.文本文件 在 Spark 中读写文本文件很容易. 当我们将一个文本文件读取为 RDD 时,输入的每一行 都会成为 RDD 的 一个元素. 也可以将多个完整的文本文件一次 ...

  4. Weebly免费自助建站空间:可视化编辑网页搭建网站和绑定域名方法

    Weebly空间来自美国,已经稳定运行了有多年了,2007年被Time 评为50个最佳网站,属自助建站模式,功能强大.部落在09年时介绍了weebly.com自助建站服务,没有想到这多年来,Weebl ...

  5. 和我一起学Effective Java之创建和销毁对象

    前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...

  6. [Bayes] Understanding Bayes: A Look at the Likelihood

    From: https://alexanderetz.com/2015/04/15/understanding-bayes-a-look-at-the-likelihood/ Reading note ...

  7. ef 某些字段更新 某些字段不更新

    不更新 _pocDbContext.Entry<UploadFileActiveTask>(activeTask).Property("id").IsModified ...

  8. 解决wireshark检测不到网卡的问题

    第一步 1.打开windows设备管理器. 2.查看-显示隐藏的设备 3.非即插即用驱动程序 4.NetGroup Packet Filter Driver 右键属性---驱动程序---启动类型,修改 ...

  9. iOS - 标准时间与时间戳相互转换

    做倒计时后台传的不是时间戳,是时间然后需要与系统时间对比得出时间戳进行倒计时显示 #pragma mark -- 倒计时 // 倒计时时间 NSString* timeStr = task.recei ...

  10. 60款很酷的 jQuery 幻灯片演示和下载【转】

    jQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果,其中之一就是幻灯片效果的实现,这是一种在有限的网页空间内展 ...