【bzoj5452】[Hnoi2016]大数(莫队)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4542
首先若p=2,5则这题就是道傻逼题,前缀和搞一下没了。如果p为其他质数,那么可以这么处理:
我们先预处理出数组num[i]表示原串第i~n位表示的数模p的余数,那么第l~r位表示的数模p的余数为(num[l]-num[r+1])/10^(n-r),因为10^(n-r)与p互质,所以若num[l]=num[r+1],则第l~r位表示的数是p的倍数。于是莫队一下就好了。
代码:
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<string>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 2000010
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
using namespace std;
struct data{
int l,r,id;
}a[];
struct data2{
ll val;
int id;
}x[];
char s[];
ll rk[],cnt[],ans[],sum1[],sum2[];
int n,m,size;
ll p,tot;
bool cmp(data a,data b){return a.l/size!=b.l/size?a.l/size<b.l/size:a.r<b.r;}
bool cmp2(data2 a,data2 b){return a.val<b.val;}
int main()
{
p=read();
scanf("%s",s); n=strlen(s); size=sqrt(n);
m=read();
if(p==||p==){
sum1[]=sum2[]=;
for(int i=;i<=n;i++){
sum1[i]=sum1[i-]; sum2[i]=sum2[i-];
if((s[i-]-'')%p==)++sum1[i],sum2[i]+=i;
}
for(int i=;i<=m;i++){
int l=read(),r=read();
printf("%lld\n",sum2[r]-sum2[l-]-(sum1[r]-sum1[l-])*(l-));
}
fclose(stdin); fclose(stdout);
return ;
}
for(int i=;i<=m;i++)
a[i].l=read()-,a[i].r=read(),a[i].id=i;
sort(a+,a+m+,cmp);
ll tmp=; x[n].val=; x[n].id=n;
for(int i=n-;i>=;i--,tmp=tmp*%p)x[i].val=(x[i+].val+(s[i]-'')*tmp)%p,x[i].id=i;
sort(x,x+n+,cmp2);
rk[x[].id]=;
for(int i=;i<=n;i++)
if(x[i].val==x[i-].val)rk[x[i].id]=rk[x[i-].id];
else rk[x[i].id]=i;
tot=;
for(int i=a[].l;i<=a[].r;i++)
tot+=cnt[rk[i]]++;
ans[a[].id]=tot;
for(int i=;i<=m;i++){
if(a[i-].l<a[i].l){
for(int j=a[i-].l;j<a[i].l;j++)
tot-=--cnt[rk[j]];
}
else{
for(int j=a[i].l;j<a[i-].l;j++)
tot+=cnt[rk[j]]++;
}
if(a[i-].r<a[i].r){
for(int j=a[i-].r+;j<=a[i].r;j++)
tot+=cnt[rk[j]]++;
}
else{
for(int j=a[i].r+;j<=a[i-].r;j++)
tot-=--cnt[rk[j]];
}
ans[a[i].id]=tot;
}
for(int i=;i<=m;i++)
printf("%lld\n",ans[i]);
}
bzoj4542
【bzoj5452】[Hnoi2016]大数(莫队)的更多相关文章
- 【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 个询问,每个 ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- bzoj4542 [Hnoi2016]大数 莫队+同余
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)
正经题解在最下面 http://blog.csdn.net/qq_32739495/article/details/51286548 写的时候看了大神的题解[就是上面那个网址],看到下面这段话 观察题 ...
- [HNOI2016]序列(莫队,RMQ)
[HNOI2016]序列(莫队,RMQ) 洛谷 bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
随机推荐
- Pycharm 2017 12月最新激活码
激活的办法:这个必须的联网才可以使用(每次打开PyCharm都需要电脑联网才可以正常使用),要是没网的话,就不能激活使用啦,大家注意哈. http://idea.iteblog.com/key.php ...
- 7.15;linux命令
麦克维瀑布 https://farm5.staticflickr.com/4269/34749113172_d6c1ba274a_k.jpg ----------------------------- ...
- 【BZOJ4439】[Swerc2015]Landscaping 最小割
[BZOJ4439][Swerc2015]Landscaping Description FJ有一块N*M的矩形田地,有两种地形高地(用‘#’表示)和低地(用‘.’表示) FJ需要对每一行田地从左到右 ...
- Powershell&.NET数值取整处理
如何取一个数的整数值? 使用类型强制转换 Powershell的强制转换有2种方式,一种是直接类型强制转换,另一种是通过-as运算符进行转换 PS F:\> [int] (3 / 2) # 直接 ...
- 使用Dell R710 IDRAC挂载虚拟介质
Dell DRAC,虚拟介质分离或所选虚拟磁盘驱动器的虚拟介质重定向已由另一用户使用 DELL Idrac 一台Dell的R710服务器,远程管理器后发现虚拟介质无法映射,一直提示“虚拟介质分离或所选 ...
- Let's encrypt申请泛域名证书以及报错处理
申请泛域名证书的步骤请参考该链接地址: https://www.jianshu.com/p/df6d13187578 报错信息: No matching distribution found for ...
- wire_format.cc:1091] String field 'accountid' contains invalid UTF-8 data when serializing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes.
原因: 在protobuf 的string字段中存在中文,序列化的时候会出现截断数据,string这个类型带有检查功能 解决方法: 把protobuf中存在中文的string字段类型 改为bytes ...
- 使用electron进行原生应用的打包
因为信奉一句话:JavaScript 终将一统天下,所以要想方设法开疆扩土. 今天介绍的这个electron就是一大神器,可以很方便的将网页应用打包为Mac, Win, Linux下的可执行文件,只需 ...
- poco库 RSA加解密
#include "poco/Crypto/Cipher.h"#include "poco/Crypto/CipherFactory.h"#include &q ...
- python通过原生sql查询数据库(共享类库)
#!/usr/bin/python # -*- coding: UTF-8 -*- """DB共享类库""" # 使用此类,先实例化一个Da ...