洛谷P3245 [HNOI2016]大数 【莫队】
题解##
除了\(5\)和\(2\)
后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数
只用对区间种相同数个数\(x\)贡献\({x \choose 2}\)
经典莫队题
\(P = 2\)或\(5\)就特判一下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 100005,maxm = 100005,INF = 1000000000;
LL n,m,P,B;
char s[maxn];
LL ans[maxn];
struct Que{int l,r,b,id;}q[maxn];
inline bool operator <(const Que& a,const Que& b){
return a.b == b.b ? a.r < b.r : a.l < b.l;
}
void solve1(){
scanf("%lld",&m);
REP(i,m) scanf("%d%d",&q[i].l,&q[i].r),q[i].id = i,q[i].b = q[i].l / B;
sort(q + 1,q + 1 + m);
LL L = q[1].l,R = q[1].r; LL cnt = 0,sum = 0;
for (int i = L; i <= R; i++){
if ((s[i] - '0') % P == 0) cnt++,sum += i - L + 1;
}
ans[q[1].id] = sum;
for (int i = 2; i <= m; i++){
while (L != q[i].l || R != q[i].r){
if (L < q[i].l){
sum -= cnt;
if ((s[L] - '0') % P == 0) cnt--;
L++;
}
if (L > q[i].l){
L--;
if ((s[L] - '0') % P == 0) cnt++;
sum += cnt;
}
if (R < q[i].r){
R++;
if ((s[R] - '0') % P == 0) cnt++,sum += R - L + 1;
}
if (R > q[i].r){
if ((s[R] - '0') % P == 0) cnt--,sum -= R - L + 1;
R--;
}
}
ans[q[i].id] = sum;
}
REP(i,m) printf("%lld\n",ans[i]);
}
int b[maxn],bi,a[maxn],tot,bac[maxn];
int getn(int x){return lower_bound(b + 1,b + 1 + tot,x) - b;}
LL C(LL x){
if (x <= 1) return 0;
return x * (x - 1) / 2;
}
void solve2(){
for (int i = n,bin = 1; i; i--,bin = bin * 10 % P){
b[i] = a[i] = ((s[i] - '0') * bin % P + a[i + 1]) % P;
}
n++;
sort(b + 1,b + 1 + n); tot = 1;
for (int i = 2; i <= n; i++) if (b[i] != b[tot]) b[++tot] = b[i];
for (int i = 1; i <= n; i++) a[i] = getn(a[i]);
scanf("%lld",&m);
REP(i,m){
scanf("%d%d",&q[i].l,&q[i].r); q[i].r++;
q[i].id = i,q[i].b = q[i].l / B;
}
sort(q + 1,q + 1 + m);
LL L = q[1].l,R = q[1].r; LL sum = 0;
for (int i = L; i <= R; i++){
sum -= C(bac[a[i]]);
sum += C(++bac[a[i]]);
}
ans[q[1].id] = sum;
for (int i = 2; i <= m; i++){
while (L != q[i].l || R != q[i].r){
if (L < q[i].l){
sum -= C(bac[a[L]]);
sum += C(--bac[a[L]]);
L++;
}
if (L > q[i].l){
L--;
sum -= C(bac[a[L]]);
sum += C(++bac[a[L]]);
}
if (R < q[i].r){
R++;
sum -= C(bac[a[R]]);
sum += C(++bac[a[R]]);
}
if (R > q[i].r){
sum -= C(bac[a[R]]);
sum += C(--bac[a[R]]);
R--;
}
}
ans[q[i].id] = sum;
}
REP(i,m) printf("%lld\n",ans[i]);
}
int main(){
scanf("%lld%s",&P,s + 1);
n = strlen(s + 1); B = (int)sqrt(n) + 1;
if (P == 2 || P == 5) solve1();
else solve2();
return 0;
}
洛谷P3245 [HNOI2016]大数 【莫队】的更多相关文章
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- 洛谷P3246 [HNOI2016]序列 [莫队]
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)
题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- 洛谷 P4396 (离散化+莫队+树状数组)
### 洛谷P4396 题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 洛谷P4396 作业 [AHOI2013] 莫队
正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...
- 洛谷 P2056 采花 - 莫队算法
萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以 ...
随机推荐
- JQuery根据关键字检索html元素并筛选显示
背景:标题比较唬人,实际上就是在文本框中输入关键字,通过关键字检索html元素,筛选后显示在界面上. Html元素如下: <div> <input type="text&q ...
- JAVA 优先获取外网Ip,再获取内网Ip
1.获取内网Ip private String getLocalhostIp(){ String hostAddress = ""; try { InetAddress addre ...
- 【Django】Django中的模糊查询以及Q对象的简单使用
Django中的模糊查询: 需要做一个查找的功能,所以需要使用到模糊查询. 使用方法是:字段名加上双下划线跟上contains或者icontains,icontains和contains表示是否区分大 ...
- build path导入的jar失效导致找不到类
今天碰到一个很奇葩的问题,搞起我以后都不敢 build path到jar了 所以我就全部放到lib目录下了,因为之前使用build path导入的jar失效了,一直找不类,具体原因我也不清楚,我之前的 ...
- Ansible学习 安装
对于运维人员来说,自动化工具是日常工作中比不可少的.Ansible是一个很好的自动化工具. Ansible默认使用SSH协议管理机器,在管理主机上安装Ansible,管理主机和被管理主机只要安装了py ...
- 科学计算库Numpy——数组形状
改变数组维数 给数组的shape属性赋值,改变数组的维数.数组的大小是不能改变的. 增加维度 使用np.newaxis增加维度. 删除维度 使用squeeze()删除维度是1的维度,也就是删除shap ...
- python-01 spider原理
用Python可以做什么?可以做日常任务,比如自动备份你的MP3:可以做网站,很多著名的网站包括YouTube就是Python写的:可以做网络游戏的后台,很多在线游戏的后台都是Python开发的.总之 ...
- 动态规划:HDU-1203-0-1背包问题:I NEED A OFFER!
解题心得: 动态规划就是找到状态转移方程式,但是就本题0-1背包问题来说转移方程式很简单,几乎看模板就行了. 在本题来说WA了很多次,很郁闷,因为我记录v[i]的时候i是从0开始的,一些特殊数据就很尴 ...
- 【Directory】文件操作(初识文件操作二)
上篇我们说了关于文件的创建删除更改可以通过File这个类来完成.对于目录的操作其实File类也可以完成创建删除等相关的操作.用法跟文件的方法大致相同. 那么下面就一起来看一下关于目录相关的用法. 一, ...
- 用js立即执行函数开发基于bootstrap-multiselect的联动参数菜单
代码调用方式如下: data=[{F0:总分类cd,F1:总分类name,F2:大分类cd,F3:大分类name,F4:中分类cd,F5:中分类name,F6:小分类cd,F7:小分类name},.. ...