Luogu 3245 大数
Luogu 3245 大数
- 开始就想 \(10\) 进制 \(hash\) ,\(Hash(r)\equiv Hash(l-1)\cdot 10^{r-l+1}\) ,感觉没什么美妙的性质啊...
- 然后把 \(hash\) 换个方向,先加低位,再加高位,就成了 \(\frac {Hash(l)-Hash(r+1)} {10^{n-r}}\equiv 0\) ,似乎,就很美妙了?
- 当 \(P\not=2,5\) 时,下面的分母有逆元,那么只能是 \(Hash(l)\equiv Hash(r+1)\) ,就变成了在一段区间内问相同元素的对数,离散化之后,用莫队可以解决.
- 当 \(P=2,5\) 时,一段区间内仅有以 \(P,0\) 结尾的串符合条件,计数相当简单.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int MAXN=1e5+10;
int n,m,P;
inline int add(int a,int b)
{
return (a + b) % P;
}
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
struct query
{
int l,r,id,bel;
bool operator < (const query &rhs) const
{
if(bel!=rhs.bel)
return bel<rhs.bel;
if(r!=rhs.r)
return r<rhs.r;
return l<rhs.l;
}
}q[MAXN];
char buf[MAXN];
int Hash[MAXN],cp[MAXN];
int cnt[MAXN];
ll ans[MAXN],res;
void add(int x)
{
res+=cnt[Hash[x]];
++cnt[Hash[x]];
}
void rem(int x)
{
--cnt[Hash[x]];
res-=cnt[Hash[x]];
}
int sumcnt[MAXN],sumpos[MAXN];
void solve_spj()
{
for(int i=1;i<=n;++i)
{
if(buf[i]-'0'==0 || buf[i]-'0'==P)
sumcnt[i]=1,sumpos[i]=i;
sumcnt[i]+=sumcnt[i-1];
sumpos[i]+=sumpos[i-1];
}
m=read();
for(int i=1;i<=m;++i)
{
int l=read(),r=read();
ll cntsum=sumcnt[r]-sumcnt[l-1],possum=sumpos[r]-sumpos[l-1];
ll res=possum-1LL*(l-1)*cntsum;
printf("%lld\n",res);
}
}
int main()
{
P=read();
scanf("%s",buf+1);
n=strlen(buf+1);
if(P==2 || P==5)
{
solve_spj();
return 0;
}
int pow10=1;
for(int i=n;i>=1;--i)
{
cp[i]=Hash[i]=add(Hash[i+1],mul(buf[i]-'0',pow10));
pow10=mul(pow10,10);
}
++n;//0
sort(cp+1,cp+1+n);
int tot=unique(cp+1,cp+1+n)-cp-1;
for(int i=1;i<=n;++i)
Hash[i]=lower_bound(cp+1,cp+1+tot,Hash[i])-cp;
m=read();
int BlockSize=sqrt(m);
for(int i=1;i<=m;++i)
{
q[i].l=read();
q[i].r=read();
q[i].id=i;
q[i].bel=q[i].l/BlockSize;
}
sort(q+1,q+1+m);
int L=1,R=0;
for(int i=1;i<=m;++i)
{
int l=q[i].l,r=q[i].r;
++r;
if(l==r)
continue;
while(R<r)
add(++R);
while(L<l)
rem(L++);
while(L>l)
add(--L);
while(R>r)
rem(R--);
ans[q[i].id]=res;
}
for(int i=1;i<=m;++i)
printf("%lld\n",ans[i]);
return 0;
}
Luogu 3245 大数的更多相关文章
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- luogu P3245 [HNOI2016]大数
传送门 \(HNOI2019\)前最后一题了qwq 这题要分情况,如果\(p=2\)或\(5\),那么只要区间内最后一个数字是\(p\)的倍数就好了,这个可以莫队,也有更优秀的做法.莫队做法可以看代码 ...
- Luogu 3332 [ZJOI2013]K大数查询
BZOJ 3110 很早就想写的试炼场题. 不会整体二分啊呜呜呜,只能写写树套树. 有一个trick就是外层使用一个权值线段树,把位置作为下标的线段树放在内层,这样子的话我们在查询$k$大的时候就可以 ...
- 【Luogu】P3332K大数查询(树套树)
题目链接 这题我费尽心思不用标记永久化终于卡过去了qwq 权值线段树下面套一个区间线段树.然后乱搞搞即可. // luogu-judger-enable-o2 #include<cstdio&g ...
- [HNOI 2016]大数
Description 题库链接 给你一个长度为 \(n\) ,可含前导零的大数,以及一个质数 \(p\) . \(m\) 次询问,每次询问你一个大数的子区间 \([l,r]\) ,求出子区间中有多少 ...
- 【树状数组套主席树】带修改区间K大数
P2617 Dynamic Rankings 题目描述给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+ ...
- [ZJJOI2013]K大数查询 整体二分
[ZJJOI2013]K大数查询 链接 luogu 思路 整体二分. 代码 #include <bits/stdc++.h> #define ll long long using name ...
- 洛谷P1050 循环【java大数】
题目:https://www.luogu.org/problemnew/show/P1050 题意:给定一个数$n$,问$n$的幂次的最低$k$位的循环节是多少. 思路:这真是我做过最难的java大数 ...
- 洛谷P1080 国王游戏【大数】【贪心】
题目:https://www.luogu.org/problemnew/show/P1080 题意: 一个国王和n个大臣,每个人左右手上都有一个数值. 现在将国王排在队首,将大臣进行排序.每个大臣的值 ...
随机推荐
- Eclipse 打包jar
1.将项目打成jar: 1.1 要将项目打包成jar文件,方法很多,可以用Eclipse自带的打包工具Ant打包,也可以用Eclipse的Export生成jar.经过尝试后,我不推荐用Ant打包,因为 ...
- RabbitMQ入门_07_Fanout 与 Topic
A. 用广播的方式实现发布订阅 参考资料:https://www.rabbitmq.com/tutorials/tutorial-three-java.html Fanout 类型的 Exchange ...
- 玲珑杯 ACM热身赛 #2.5 A 记忆化搜索+瞎搞
#include <cstdio> #include <vector> #include <iostream> #include <algorithm> ...
- Andriod的Http请求获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息
Android使用Http请求登录,则通过登录成功获取Cookie信息并同步,可以是下一次不用登录也可以查看到个人信息, 注:如果初始化加载登录,可通过缓存Cookie信息来验证是否要加载登录界面.C ...
- dubbo监控报错Error creating bean with name 'uriBrokerService'
在jdk1.8下面会出现此错误 解决方法: 1.更换服务器jdk版本.(会影响其他项目环境) 2.修改dubbo-admin tomcat默认jdk版本. 3.修改dubbo-admin项目依赖(de ...
- Three Pieces CodeForces - 1065D (BFS)
链接 大意: n*n棋盘, 每个格子写有数字, 各不相同, 范围[1,n*n], 初始在数字1的位置, 可以操纵knight,bishop,rook三种棋子, 每走一步花费1, 交换棋子花费1, 问按 ...
- hdu1180 优先队列bfs+判断方向
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- Superset
Superset是一款可自助.可交互,可视化非常不错的产品 Superset is a data exploration platform designed to be visual, intuiti ...
- 第 4 章—— C# 语言特性(《精通 ASP.NET MVC 5》)
这里只提供各个特性的简单概括. C# 的完整指南可参阅<Introducing Visual C#>.深度了解 LINQ 可参考<Pro LINQ in C#> 4.1 准备示 ...
- Java容器——Map接口
1.定义 Map用于保存存在映射关系<key, value>的数据.其中key值不能重复(使用equals()方法比较),value值可以重复. 2.常用实现类 HashMap:和Hash ...