4542: [Hnoi2016]大数
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的倍数。
Input
第一行一个整数:P。第二行一个串:S。第三行一个整数:M。接下来M行,每行两个整数 fr,to,表示对S 的
子串S[fr…to]的一次询问。注意:S的最左端的数字的位置序号为 1;例如S为213567,则S[1]为 2,S[1…3]为 2
13。N,M<=100000,P为素数
Output
输出M行,每行一个整数,第 i行是第 i个询问的答案。
Sample Input
121121
3
1 6
1 5
1 4
Sample Output
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。
HINT
2016.4.19新加数据一组
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long int64;
char ch;
bool ok;
void read(int &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
void read(int64 &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
char s[maxn];
int n,q,sn,x,y,bel[maxn],tot,cnt[maxn];
int64 mod,a[maxn],ans[maxn],res,pw[maxn],list[maxn];
struct Querys{
int l,r,id;
void init(int i){read(l),read(r),l=n-l+,r=n-r+,swap(l,r),l--,/*cout<<"FFFF "<<l<<' '<<r<<endl,*/id=i;}
}querys[maxn];
bool cmp(const Querys &a,const Querys &b){return bel[a.l]<bel[b.l]||(bel[a.l]==bel[b.l]&&bel[a.r]<bel[b.r]);}
void modify(int col,int op){
if (op==) /*cout<<res<<' '<<col<<' '<<cnt[col]<<endl,*/res+=cnt[col],cnt[col]++;
else cnt[col]--,res-=cnt[col];
}
void work(){
int l=,r=; cnt[a[]]=,res=;
for (int i=;i<=q;i++){
for (;l<querys[i].l;l++) modify(a[l],-);
for (;l>querys[i].l;l--) modify(a[l-],);
for (;r<querys[i].r;r++) modify(a[r+],);
// cout<<"res="<<res<<endl;
for (;r>querys[i].r;r--) modify(a[r],-);
ans[querys[i].id]=res;
}
}
int cnt2[maxn],cnt5[maxn];
int64 ans2[maxn],ans5[maxn];
int main(){
read(mod);
if (mod==){
scanf("%s",s+),n=strlen(s+);
for (int i=;i<=n;i++){
cnt2[i]=cnt2[i-],ans2[i]=ans2[i-];
if ((s[i]-'')%==) cnt2[i]++,ans2[i]+=i;
}
for (read(q);q;q--){
read(x),read(y);
printf("%lld\n",ans2[y]-1LL*(cnt2[y]-cnt2[x-])*(x-)-ans2[x-]);
}
}
else if (mod==){
scanf("%s",s+),n=strlen(s+);
for (int i=;i<=n;i++){
cnt5[i]=cnt5[i-],ans5[i]=ans5[i-];
if ((s[i]-'')%==) cnt5[i]++,ans5[i]+=i;
}
for (read(q);q;q--){
read(x),read(y);
printf("%lld\n",ans5[y]-1LL*(cnt5[y]-cnt5[x-])*(x-)-ans5[x-]);
}
}
else{
scanf("%s",s+),n=strlen(s+),sn=sqrt(n);
for (int i=,j=n;i<j;i++,j--) swap(s[i],s[j]);
for (int i=;i<=n;i++) bel[i]=i/sn;
// for (int i=0;i<=n;i++) cout<<i<<' ';cout<<endl;
// for (int i=0;i<=n;i++) cout<<bel[i]<<' ';cout<<endl;
pw[]=;
for (int i=;i<=n;i++) pw[i]=1LL*pw[i-]*%mod;
for (int i=;i<=n;i++) a[i]=(a[i-]+1LL*(s[i]-'')*pw[i-]%mod)%mod;
for (int i=;i<=n;i++) list[++tot]=a[i];
sort(list+,list+tot+),tot=unique(list+,list+tot+)-list-;
// for (int i=0;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
for (int i=;i<=n;i++) a[i]=lower_bound(list+,list+tot+,a[i])-list;
// for (int i=0;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
read(q);
// cout<<q<<endl;
for (int i=;i<=q;i++) querys[i].init(i);
// for (int i=1;i<=q;i++) cout<<querys[i].l<<' '<<querys[i].r<<' '<<querys[i].id<<endl;
sort(querys+,querys+q+,cmp);
work();
for (int i=;i<=q;i++) printf("%lld\n",ans[i]);
}
return ;
}
/*
11
121121
3
1 6
1 5
1 4
*/
4542: [Hnoi2016]大数的更多相关文章
- 4542: [Hnoi2016]大数
4542: [Hnoi2016]大数 链接 分析: 如果p等于2或者5,可以根据最后一位直接知道是不是p的倍数,所以直接记录一个前缀和即可. 如果p不是2或者5,那么一个区间是p的倍数,当且仅当$\f ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- 【BZOJ】4542: [Hnoi2016]大数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4542 给定一个由数字构成的字符串${S_{1,2,3,...,n}}$,一个正素数$P$, ...
- bzoj 4542 [Hnoi2016]大数 (坑)
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...
- bzoj 4542: [Hnoi2016]大数
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- 【LG3245】[HNOI2016]大数
[LG3245][HNOI2016]大数 题面 洛谷 题解 60pts 拿vector记一下对于以每个位置为右端点符合要求子串的左端点, 则每次对于一个询问,扫一遍右端点在vector里面二分即可, ...
- 【BZOJ4542】[Hnoi2016]大数 莫队
[BZOJ4542][Hnoi2016]大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个 ...
- 【bzoj4542】 Hnoi2016—大数
http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...
随机推荐
- SSL安全解决方案(转)
http://blog.csdn.net/photnman/article/details/388853 背景及部分安全知识在高度保证应用程序安全的过程中我们不免会考虑到如下的安全需求,然后根据这些安 ...
- Android Studio 1.0.2 设置内存大小
http://www.linuxidc.com/Linux/2015-04/116457.htm Android studio 1.0.2默认最大内存是750M,这样跑起来非常的卡,难以忍受,机器又不 ...
- leetcode 题解 || Swap Nodes in Pairs 问题
problem: Given a linked list, swap every two adjacent nodes and return its head. For example, Given ...
- [Redux] Normalizing the State Shape
We will learn how to normalize the state shape to ensure data consistency that is important in real- ...
- 【Qt】测测你对Qt的了解–Qt工具知多少
原文:http://blog.163.com/lijiji_1515/blog/static/1268774462009103101944455/ 你知道Qt都提供了哪些工具吗? 你知道Qt的 ...
- Linux学习笔记总结--CentOS 设置静态IP
1.修改网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth ...
- 浅谈Android自定义锁屏页的发车姿势
一.为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸 ...
- SSH公钥(public key)验证
安全的设置服务器 登陆,之前用用户名和密码登陆服务器 这样不安全 ,用SSH公钥(public key)验证 这个办法能很好的解决 登陆服务器 和安全登陆服务器 的特点: 目标: Client 免输 ...
- Validation Rule和Binding Group
WPF学习之绑定-Validation Rule和Binding Group 在上一篇文章中我们讨论了有关WPF绑定的知识点,现在我们可以很容易的将业务数据作为源绑定到WPF控件并可以通过创建不同的D ...
- get方式请求会出现中文乱码。post方式不会。
get方式请求会出现中文乱码.post方式不会. 如果是要解决get方式中文乱码问题,就需要做一个拦截器,或者在web.xml做一个get请求的配置 来自为知笔记(Wiz)