正解:莫队

解题报告:

传送门

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

若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. Guava Lists.transform踩坑小记<转>

    1.问题提出 1.前段时间在项目中用到Lists.transform返回的List,在对该list修改后发现修改并没有反映在结果里,研究源码后发现问题还挺大.下面通过单步调试的结果来查看Guava L ...

  2. BitSet的用法

    1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数 ...

  3. IDEA的这八条配置你一定要改!

    一定要改的八条军规.快捷键使用idea默认的,与其他同事保存一致 自动编译开关 忽略大小写开关 智能导包开关 悬浮提示开关 取消单行显示tabs的操作 项目文件编码 滚轴修改字体大小 设置行号显示 在 ...

  4. Linux查找指令(阮一峰)

    1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...

  5. Mac获取公网ip

    终端输入 curl http://members.3322.org/dyndns/getip way 2: ➜ ~ wget http://ipecho.net/plain -O - -q ; ech ...

  6. 关于tomcat7服务下面js无法获取JSESSIONID的cookie信息

    http://tomcat.apache.org/tomcat-5.5-doc/config/context.html Does anyone know what changed in the con ...

  7. [IR] XPath for Search Query

    XPath 1.0 XPath Containment Distributed Query Evaluation RE and DFA XPath 1.0 -- 在XML中的使用 XPath 语法: ...

  8. 36个让人惊讶的 CSS3 动画效果演示【转】

    本文收集了35个惊人的 CSS3 动画演示,它们将证明 CSS3 Transform 和 Transition 属性的强大能力.CSS 是网页设计非常重要的一部分,随着越来越多的浏览器对 CSS3 支 ...

  9. Spark RDD Transformation 简单用例(二)

    aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) aggregateByKey(zeroValue)(seqOp, combOp, [numTa ...

  10. Spark RDD 默认分区数量 - repartitions和coalesce异同

    RDD.getNumPartitions()方法可以获得一个RDD分区数量, 1.默认由文件读取的话,本地文件会进行shuffle,hdfs文件默认会按照dfs分片来设定. 2.计算生成后,默认会按照 ...