4542: [Hnoi2016]大数

链接

分析:

  如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可。

  如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\frac{b[l] - b[r + 1]}{10 ^ {r - l + 1}} = 0 \ (mod \ p)$。

  由于p不是2或者5,所以10与p互质,条件转化为$b[r] - b[l] = 0 \ (mod \ p)$ ,于是将b离散化后,莫队即可。
代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
int p;
char s[N];
namespace BF1{
LL s1[N], s2[N];
void solve() {
scanf("%s",s + );
int n = strlen(s + );
for (int i = ; i <= n; ++i) {
s1[i] = s1[i - ], s2[i] = s2[i - ];
if ((s[i] - '') % p == ) s1[i] ++, s2[i] += i;
}
int m = read();
while (m --) {
int l = read(), r = read();
printf("%lld\n", s2[r] - s2[l - ] - 1ll * (l - ) * (s1[r] - s1[l - ]));
}
}
}
namespace BF2{
struct Que{ int l, r, bel, id; } Q[N];
bool operator < (const Que &A,const Que &B) { return A.bel == B.bel ? A.r < B.r : A.bel < B.bel; }
int a[N], cnt[N];
LL ans[N], b[N], disc[N];
void solve() {
scanf("%s", s + );
int n = strlen(s + ), B = sqrt(n);
for (int i = n, pw = ; i >= ; --i, pw = 1ll * pw * % p) // 开long long
disc[i] = b[i] = (1ll * (s[i] - '') * pw % p + b[i + ]) % p;
disc[n + ] = ;
sort(disc + , disc + n + );
int tot = ;
for (int i = ; i <= n + ; ++i) if (disc[i] != disc[tot]) disc[++tot] = disc[i];
for (int i = ; i <= n + ; ++i) a[i] = lower_bound(disc + , disc + tot + , b[i]) - disc;
int m = read();
for (int i = ; i <= m; ++i)
Q[i].l = read(), Q[i].r = read() + , Q[i].bel = (Q[i].l - ) / B + , Q[i].id = i;
sort(Q + , Q + m + );
int L = , R = ; LL now = ;
for (int i = ; i <= m; ++i) {
while (L > Q[i].l) L --, now += cnt[a[L]], cnt[a[L]] ++;
while (R < Q[i].r) R ++, now += cnt[a[R]], cnt[a[R]] ++;
while (L < Q[i].l) cnt[a[L]] --, now -= cnt[a[L]], L ++;
while (R > Q[i].r) cnt[a[R]] --, now -= cnt[a[R]], R --;
ans[Q[i].id] = now;
}
for (int i = ; i <= m; ++i) printf("%lld\n", ans[i]);
}
}
int main() {
p = read();
if (p == || p == ) BF1::solve();
else BF2::solve();
return ;
}

4542: [Hnoi2016]大数的更多相关文章

  1. BZOJ.4542.[HNOI2016]大数(莫队)

    题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...

  2. 【BZOJ】4542: [Hnoi2016]大数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4542 给定一个由数字构成的字符串${S_{1,2,3,...,n}}$,一个正素数$P$, ...

  3. bzoj 4542 [Hnoi2016]大数 (坑)

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...

  4. 4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  5. bzoj 4542: [Hnoi2016]大数

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  6. bzoj 4542: [Hnoi2016]大数 (莫队)

    Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...

  7. 【LG3245】[HNOI2016]大数

    [LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...

  8. 【BZOJ4542】[Hnoi2016]大数 莫队

    [BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...

  9. 【bzoj4542】 Hnoi2016—大数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...

随机推荐

  1. 解决js跨域

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  2. mysql-5.7 持久化统计信息详解

    一.持久化统计信息的意义: 统计信息用于指导mysql生成执行计划,执行计划的准确与否直接影响到SQL的执行效率:如果mysql一重启 之前的统计信息就没有了,那么当SQL语句来临时,那么mysql就 ...

  3. 铁乐学python_day20_面向对象编程2

    面向对象的组合用法 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合. 例:人狗大战,人类绑定上武器来对狗进行攻击: # 定 ...

  4. Asp.Net网站的的编译与发布原理

    如下所示创建一个简单的asp.Net Web应用程序                     在VS中生成解决方案之后,可以在项目的目录下看到以下的文件:                       ...

  5. November 26th 2016 Week 48th Saturday

    All growth is a leap in the dark. 所有的成长都是黑暗中的一跃. But it is a dark and long night, I can't see any st ...

  6. 【Alpha】Daily Scrum Meeting 集合贴

    coding:https://git.coding.net/hmCoding/LearnTGP.git 11月14日:http://www.cnblogs.com/polk-blogs/p/78270 ...

  7. 【Alpha】Daily Scrum Meeting——blog3

    团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 2. 每个人的工作 姓名 已完成工作 计划完成工作 遇到的困 ...

  8. VM下,装centos7系统,配置nginx的问题

    一.流程 1.先安装nginx依赖的包 (1)yum install gcc-c++ (2)yum install -y pcre pcre-devel (3)yum install -y zlib ...

  9. 20155314 2016-2017-2 《Java程序设计》实验二 Java面向对象程序设计

    20155314 2016-2017-2 <Java程序设计>实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UM ...

  10. ajax执行失败原因

    ajax 跳入error的一些原因 先放一个标准的jquery的ajax代码: $.ajax({ type: 'POST', url: 'getSecondClassification', data: ...