题意:给定一个N位的由[0..9]组成的数字串和质数P,有M次不强制在线的询问,每次询问区间[l,r]中模P意义下为0的子串个数

N,M<=2e5,P<=1e10

思路:一次A,本来还以为要调好长时间……

考虑类似于字符串哈希的思路,预处理出每个后缀在模P意义下的余数,设从第i位到第N位的后缀的值为s[i]

[L,R]这段区间的值*10^(N-R)=s[L]-s[R+1]

特判P=2和P=5,因为是10进制只需要考虑最后一位能被整除,对于每一个询问计算每一位的贡献做前缀和即可

P取其他值时质数10^(N-R)与P必定互质,所以若[L,R]这段的值能被P整除,则s[L]-s[R+1]必定需要被P整除

取模后等价于[L,R+1]一段数字中相等数字对数,是经典的莫队

莫队部分好像都是先写扩大区间部分再写缩小区间部分的

条件允许的话还是要把所有细节想清楚了再写,效率会高很多

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
#define N 210000 struct node
{
int x,y,id;
}c[N]; ll a[N],b[N],s[N],ans[N],pos[N],A[N];
char ch[N];
int n,m; bool cmp(node a,node b)
{
if(pos[a.x]==pos[b.x]) return a.y<b.y;
return a.x<b.x;
} void init()
{
int block=int(sqrt(N));
for(int i=;i<=N;i++) pos[i]=(i-)/block+;
} void solve()
{
memset(s,,sizeof(s));
ll tmp=;
int nowx=;
int nowy=;
for(int i=;i<=m;i++)
{
while(nowx>c[i].x)
{
tmp+=s[a[nowx-]];
s[a[nowx-]]++;
nowx--;
}
while(nowy<c[i].y)
{
tmp+=s[a[nowy+]];
s[a[nowy+]]++;
nowy++;
}
while(nowx<c[i].x)
{
s[a[nowx]]--;
tmp-=s[a[nowx]];
nowx++;
}
while(nowy>c[i].y)
{
s[a[nowy]]--;
tmp-=s[a[nowy]];
nowy--;
}
ans[c[i].id]=tmp;
}
} int main()
{
ll MOD;
scanf("%lld",&MOD);
scanf("%s",ch+);
n=strlen(ch+);
if(MOD==||MOD==)
{
for(int i=;i<=n;i++)
if((ch[i]-'')%MOD==)
{
a[i]=i; b[i]=;
}
a[]=b[]=;
for(int i=;i<=n;i++)
{
a[i]+=a[i-];
b[i]+=b[i-];
}
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ll ans=a[y]-a[x-]-1ll*(b[y]-b[x-])*(x-);
printf("%lld\n",ans);
}
return ;
}
a[n+]=;
ll mi=;
for(int i=n;i>=;i--)
{
a[i]=(a[i+]+(ch[i]-'')*mi)%MOD;
mi=mi*%MOD;
}
n++;
for(int i=;i<=n;i++) A[i]=a[i];
sort(A+,A+n+);
A[]=unique(A+,A+n+)-A-;
for(int i=;i<=n;i++) a[i]=lower_bound(A+,A+A[]+,a[i])-A;
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&c[i].x,&c[i].y);
c[i].y++;
c[i].id=i;
}
init();
sort(c+,c+m+,cmp);
solve();
for(int i=;i<=m;i++) printf("%lld\n",ans[i]);
return ;
}

【BZOJ4542】大数(莫队)的更多相关文章

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

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

  2. [BZOJ4542] [Hnoi2016] 大数 (莫队)

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

  3. 【bzoj4542】[Hnoi2016]大数 莫队算法

    题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...

  4. bzoj4542 [Hnoi2016]大数 莫队+同余

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4542 题解 我们令 \(f_i\) 表示从 \(i\) 到 \(n\) 位组成的数 \(\bm ...

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

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

  6. 洛谷P3245 [HNOI2016]大数(莫队)

    题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...

  7. [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)

    正经题解在最下面 http://blog.csdn.net/qq_32739495/article/details/51286548 写的时候看了大神的题解[就是上面那个网址],看到下面这段话 观察题 ...

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

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

  9. 【莫队】bzoj4542: [Hnoi2016]大数

    挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...

随机推荐

  1. rand()和srand()

    C++中rand() 函数的用法 1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数, ...

  2. 转载:jsonp详解

    json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. 同源策略 首先 ...

  3. MSBuild常用方法

    打包后把nuget包复制到指定的目录 <Target Name="CopyPackage" AfterTargets="Pack"> <Cop ...

  4. thinkphp-PHP实现Excel导入 导出功能

    Excel导出 //功能:导出题库模板 public function get_contract_ex() { ob_get_clean(); header("Content-Typ:tex ...

  5. linux下的source命令

    Linux Source命令及脚本的执行方式解析   当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用source命令,如:source /etc/profile ...

  6. Assignment HDU - 2853(二分图匹配 KM 新边旧边)

    传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...

  7. CentOS6.5生产环境系统安装

    CentOS 6.5系统安装 1-1 将预先准备的CentOS 6.5安装光盘插入光驱中,开机/重启系统时,系统会进行自检,自检完毕就会出现安装系统时的引导界面,如图1-1所示.1-2 使用键盘方向键 ...

  8. Groundhog Build Home - HDU - 3932(模拟退火)

    题意 给定一个矩形内的\(n\)个点,在矩形中找一个点,离其他点的最大距离最小. 题解 模拟退火. 这个题需要\(x\)和\(y\)坐标随机动的时候多随机几次.否则就WA了.另外由于随机多次,如果温度 ...

  9. HDU:4417-Super Mario(离线线段树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  10. ListNode Java创建链表

    用了一种自创的比较简洁的方式来创建链表 class ListNode { //为了方便,这两个变量都使用pub1ic, //存放数据的变量,直接为int型 public int data; //存放结 ...