BZOJ4542: [Hnoi2016]大数
来源:互联网 发布:淘宝待揽件是什么意思 编辑:程序博客网 时间:2024/06/05 11:24
BZOJ4542: [Hnoi2016]大数
莫队·乱搞
题解:
蛤~我这种蒟蒻怎么可能自己想出来呢2333~
但是我看网上的题解很多没有证明过程,就写一下吧~
设
因为p是素数,那么
原式:
如果
这样就转化成了一个区间中有多少对数相同,离散化一下,用莫队就可以了。
那么假如
我们发现一个数只要最后一位是2或5的倍数,不管前面是什么,它一定是。因此只考虑最后一位。
做两个前缀和,一个(A)记录前缀
好神啊QwQ……
Code:
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#define D(x) cout<<#x<<" = "<<x<<" "#define E cout<<endlusing namespace std;typedef long long ll;const int N = 100005;ll p,n,m,res,bsz; char str[N];ll cnt[N],num[N],tp[N],ans[N],A[N],B[N]; struct Que{ ll l,r,id; bool operator < (const Que &b) const { return l/bsz < b.l/bsz || (l/bsz == b.l/bsz && r < b.r); }} q[N];void insert(ll x){ res+=cnt[x]; cnt[x]++; }void erase(ll x){ cnt[x]--; res-=cnt[x]; }int main(){ freopen("a.in","r",stdin); scanf("%lld%s%lld",&p,str+1,&m); n=strlen(str+1); if(p!=2 && p!=5){ ll base=1; for(ll i=n;i>=1;i--){ base=base*10%p; num[i]=(num[i+1]+(str[i]-'0')*base)%p; tp[i]=num[i]; } tp[n+1]=num[n+1]; sort(tp+1,tp+2+n); ll tpsz=unique(tp+1,tp+2+n)-tp-1; for(ll i=1;i<=n+1;i++){ num[i]=lower_bound(tp+1,tp+1+tpsz,num[i])-tp; } bsz=sqrt(n); for(ll i=1;i<=m;i++){ scanf("%lld%lld",&q[i].l,&q[i].r); q[i].id=i; q[i].r++; } sort(q+1,q+1+m); ll lpos=1, rpos=0; for(ll i=1;i<=m;i++){ while(lpos < q[i].l){ erase(num[lpos]); lpos++; } while(lpos > q[i].l){ lpos--; insert(num[lpos]); } while(rpos < q[i].r){ rpos++; insert(num[rpos]); } while(rpos > q[i].r){ erase(num[rpos]); rpos--; } ans[q[i].id]=res; } for(ll i=1;i<=m;i++) printf("%lld\n",ans[i]); } else{ for(ll i=1;i<=n;i++){ if((str[i]-'0')%p==0){ A[i]=A[i-1]+i; B[i]=B[i-1]+1; } else{ A[i]=A[i-1]; B[i]=B[i-1]; } } ll l,r; for(ll i=1;i<=m;i++){ scanf("%lld%lld",&l,&r); printf("%lld\n",(A[r]-A[l-1])-(B[r]-B[l-1])*(l-1)); } }}
阅读全文
0 0
- bzoj4542: [Hnoi2016]大数
- BZOJ4542: [Hnoi2016]大数
- bzoj4542: [Hnoi2016]大数
- 【bzoj4542】[Hnoi2016]大数 莫队
- [bzoj4542][HNOI2016]大数
- BZOJ4542: [Hnoi2016]大数
- bzoj4542【HNOI2016】大数
- 【bzoj4542】【HNOI2016】【大数】【莫队】
- bzoj4542 [Hnoi2016]大数
- 【bzoj4542】[Hnoi2016]大数
- BZOJ4542: [Hnoi2016]大数
- [BZOJ4542][Hnoi2016]大数(莫队+数学相关)
- [BZOJ4542][HNOI2016]大数(莫队+特判)
- bzoj4542 [HNOI2016]大数(莫队+离散化+数学)
- bzoj4542 大数
- [BZOJ4542]大数
- 【BZOJ4542】大数, 莫队
- 【HNOI2016】大数
- 动态申请二维数组
- java 处理收到的微信用户消息并给出回复 --文字类消息
- Java爬虫入门简介(二) —— Jsoup解析HTML页面
- 面向对象与集合的结合
- 1162: 循环移动(指针专题)
- BZOJ4542: [Hnoi2016]大数
- ADB命令ING
- 语言小知识-python-zip操作
- Purfer Sequence
- Unity入门操作_固定路线行走_021
- PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置
- 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
- C#基础-015 简单循环goto-start
- bzoj3224普通平衡树splay