Description

小 B 有一个很大的数 S,长度达到了 N 位;这个数可以看成是一个串,它可能有前导 0,例如00009312345

小B还有一个素数P。现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也

是P 的倍数)。例如 S为0077时,其子串 007有6个子串:0,0,7,00,07,007;显然0077的子串007有6个子串都是素

数7的倍数。

solution

正解:莫队

知道结论还是比较容易的,但是细节贼多啊.

首先 \(p\) 是质数,所以满足结论:如果 \(s[i-n]\%p=s[k-n]\%p\),那么 \(s[i-k]\) 满足是 \(p\) 的倍数

第一个细节就是,特判 \(p=2,p=5\),这个时候结论不成立

然后就变成了查找区间内相同的数两两配对的方案数,莫队解决即可,另外这个模数没有给范围,实际上很大,需要离散化

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=100005;
int n,m,block;char s[N];ll mod;
namespace solve1{
ll sum[N],c[N];
void main(){
for(int i=1;i<=n;i++){
sum[i]=sum[i-1],c[i]=c[i-1];
if((s[i]-'0')%mod==0)sum[i]+=i,c[i]++;
}
int m,x,y;cin>>m;
while(m--){
scanf("%d%d",&x,&y);
printf("%lld\n",(sum[y]-sum[x-1])-(x-1)*(c[y]-c[x-1]));
}
}
}
struct node{
int l,r,b,id;
bool operator <(const node &pr)const{
if(b!=pr.b)return b<pr.b;
return r<pr.r;
}
}q[N];
ll v[N],t[N],b[N];ll ans[N],ret=0;
inline void add(int x){ret+=t[v[x]];t[v[x]]++;}
inline void delet(int x){t[v[x]]--;ret-=t[v[x]];}
void solve(){
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].r++;q[i].id=i;
q[i].b=q[i].l/block;
}
sort(q+1,q+m+1);
ll str=0,tot=1;
for(int i=n;i>=1;i--){
str+=tot*(s[i]-48);str%=mod;
tot*=10;tot%=mod;
v[i]=b[i]=str;
}
b[0]=0;
sort(b,b+n+1);
int to=unique(b,b+n+1)-b-1;
for(int i=1;i<=n+1;i++)v[i]=lower_bound(b,b+to+1,v[i])-b;
int l=1,r=0;
for(int i=1;i<=m;i++){
while(r<q[i].r)r++,add(r);
while(l>q[i].l)l--,add(l);
while(r>q[i].r)delet(r),r--;
while(l<q[i].l)delet(l),l++;
ans[q[i].id]=ret;
}
for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
}
void work()
{
scanf("%lld%s",&mod,s+1);
n=strlen(s+1);block=sqrt(n);
if(mod==2 || mod==5)solve1::main();
else solve();
} int main()
{
work();
return 0;
}

bzoj 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]大数 (坑)

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

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

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

  4. 4542: [Hnoi2016]大数

    4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...

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

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

  6. 4542: [Hnoi2016]大数

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

  7. 【LG3245】[HNOI2016]大数

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

  8. BZOJ 3110 K大数查询 | 整体二分

    BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...

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

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

随机推荐

  1. Python strip()方法

    描述 Python strip() 方法用于移除字符串头尾指定的字符(默认为空格). 语法 strip()方法语法: str.strip([chars]); 参数 chars -- 移除字符串头尾指定 ...

  2. ajax的四种type类型

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  3. jQuery 写的textarea输入字数限制

    //先判断浏览器是不是万恶的IE        var bind_name = 'input';//默认事件        if (navigator.userAgent.indexOf(" ...

  4. 一个页面多个HTTP请求 页面卡顿!

    用promise解决 前两天面试的时候 一个面试官问到这样一个问题 这里先说出解决的路径 这几天会更新具体的做法 或者直接参考廖雪峰大神 地址如下: https://www.liaoxuefeng.c ...

  5. Eclipse常用快捷键总结

    Eclipse常用快捷键总结 CTRL+C(复制).CTRL+X(剪切).CTRL+Z(撤销).CTRL+F(查找).CTRL+H(搜索文件或字符串).CTRL+Y(重做).CTRL+/(双斜杠注释) ...

  6. LeetCode & Q119-Pascal's Triangle II-Easy

    Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3 ...

  7. TF中conv2d和kernel_initializer方法

    conv2d中的padding 在使用TF搭建CNN的过程中,卷积的操作如下 convolution = tf.nn.conv2d(X, filters, strides=[1,2,2,1], pad ...

  8. Delaunay三角化算法

    参考:<平面域中的Delaunay三角算法>

  9. Python中使用hashlib进行加密的简单使用

    import hashlib ''' 原文= '字符串' 哈希加密对象 = hashlib.加密算法( 原文.encode('utf-8') ) 密文 = 哈希加密对象.hexdigest() #密文 ...

  10. 阿里云下Linux服务器安装Mysql、mongodb

    阿里云下Linux服务器安装Mysql.mongodb 一.MySQL的安装和配置 1.安装rpm包 rpm -Uvh http://dev.mysql.com/get/mysql-community ...