luogu P3245 [HNOI2016]大数
\(HNOI2019\)前最后一题了qwq
这题要分情况,如果\(p=2\)或\(5\),那么只要区间内最后一个数字是\(p\)的倍数就好了,这个可以莫队,也有更优秀的做法.莫队做法可以看代码懒
否则,考虑一个数怎么表示,记\(s_i\)为前\(i\)为构成的数,可以知道区间\([i,j]\)的数应该是\(s_r-s_{l-1}*10^{r-l+1}\),现在要求这个数模\(p\)为0,那么也就是$$s_r-s_{l-1}*10^{r-l+1}\equiv0\ (\mathrm{mod}\ p)$$
两边同时除掉\(10^r\),得到
\]
如果位置\(i\)的权值为\(s_i*10^{-i}\),那么一个区间\([i,j]\)的答案就是\([i-1,j]\)中每种权值相同的点对个数,这个还是比较好写的
#include<bits/stdc++.h>
#define LL long long
#define db long double
#define il inline
using namespace std;
const int N=1e5+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int p,a[N],n,sqt,q,be[N];
LL an[N],na;
char cc[N];
struct qu
{
int l,r,i;
bool operator < (const qu &bb) const {return be[l]!=be[bb.l]?l<bb.l:r<bb.r;}
}qq[N];
int fpow(int a,int b){a%=p;int an=1;while(b){if(b&1) an=1ll*an*a%p;a=1ll*a*a%p,b>>=1;} return an;}
namespace ct1
{
int cn;
void wk()
{
sort(qq+1,qq+q+1);
for(int i=1,l=1,r=0;i<=q;++i)
{
while(r<qq[i].r) ++r,cn+=a[r]%p==0,na+=(a[r]%p==0?r-l+1:0);
while(r>qq[i].r) na-=(a[r]%p==0?r-l+1:0),cn-=a[r]%p==0,--r;
while(l<qq[i].l) na-=cn,cn-=a[l]%p==0,++l;
while(l>qq[i].l) --l,cn+=a[l]%p==0,na+=cn;
an[qq[i].i]=na;
}
}
}
namespace ct2
{
int cn[N],b[N],m;
void wk()
{
int pp=fpow(10,p-2);
b[++m]=0;
for(int i=1,j=1,sm=0;i<=n;++i)
{
sm=1ll*sm*10%p+a[i],j=1ll*j*pp%p;
a[i]=1ll*sm*j%p;
b[++m]=a[i];
}
sort(b+1,b+m+1),m=unique(b+1,b+m+1)-b-1;
for(int i=0;i<=n;++i) a[i]=lower_bound(b+1,b+m+1,a[i])-b;
for(int i=1;i<=q;++i) --qq[i].l;
sort(qq+1,qq+q+1);
for(int i=1,l=0,r=-1;i<=q;++i)
{
while(r<qq[i].r) ++r,++cn[a[r]],na+=cn[a[r]]-1;
while(r>qq[i].r) na-=cn[a[r]]-1,--cn[a[r]],--r;
while(l<qq[i].l) na-=cn[a[l]]-1,--cn[a[l]],++l;
while(l>qq[i].l) --l,++cn[a[l]],na+=cn[a[l]]-1;
an[qq[i].i]=na;
}
}
}
int main()
{
p=rd();
scanf("%s",cc+1);
n=strlen(cc+1);
sqt=sqrt(n);
for(int i=1;i<=n;++i) a[i]=cc[i]-'0',be[i]=i/sqt;
q=rd();
for(int i=1;i<=q;++i) qq[i].l=rd(),qq[i].r=rd(),qq[i].i=i;
if(p==2||p==5) ct1::wk();
else ct2::wk();
for(int i=1;i<=q;++i) printf("%lld\n",an[i]);
return 0;
}
luogu P3245 [HNOI2016]大数的更多相关文章
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- 洛谷P3245 [HNOI2016]大数 【莫队】
题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- BZOJ4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
随机推荐
- docker 使用指南
Compose is a tool for defining and running multi-container Docker applications. With Compose, you us ...
- css 选择其父元素下的某个元素
一,选择器 :first-child p:first-child(first第一个 child子元素)(找第一个子元素为p) :last-child p:last-child(last倒数 ...
- OpenLayers学习笔记(四)— QML显示html中openlayers地图的坐标
GitHub:八至 作者:狐狸家的鱼 本文链接:实现QML中显示html中地图的坐标 如何QML与HTML通信已经在这篇文章 QML与HTML通信之画图 详细讲述了 1.HTML var coord; ...
- chip
1.芯片(chip.pas/cpp) [问题描述] 企鹅集成电路公司生产了一种大小为 2×3的芯片.每块芯片是从一块大小为N×M的硅片上切下来的,但由于原材料纯度问题,因而有若干的单位正方形并不能作为 ...
- [luogu3810][bzoj3262][陌上花开]
题目链接 思路 听说可以CDQ分治,然后我不会,所以我写树套树 首先肯定先按照a拍个序.然后就成了在b,c这两个数组中查询了.用一个树状数组套treap来维护.当插入一个数的时候,就在树状数组的b这个 ...
- 怎么自行HTTP的POST包头,需要使用json
http://bbs.csdn.net/topics/390674431 不理解你为什么这么传 post的格式如下:POST / HTTP/1.1Host: www.wrox.comUser-Agen ...
- IT项目管理分享7个开源项目管理工具
在一项调查中,有 71% 的组织表示他们在开发过程中会用到敏捷方法. 此外,用敏捷方法管理项目比传统方法管理项目成功率高 28%.在这次工具推荐中,我们从一些比较受欢迎的开源项目管理工具中摘取了支持敏 ...
- JS实现选择排序
function selectSort(arr){ var len=arr.length; var temp; for(var i=0;i<len-1;i++){ for(var j=i+1;j ...
- JSON语法、对象、遍历数组的区别和基本操作
JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是: ...
- Yarn常用命令总结
Yarn常用命令总结 1>.查看任务列表 [root@storage101 ~]# yarn application -list :: INFO client.RMProxy: Connecti ...