国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

[BZOJ4542][Hnoi2016]大數(shù)(莫隊+數(shù)學(xué)相關(guān))

2019-11-06 06:04:23
字體:
供稿:網(wǎng)友

題目描述

傳送門

題解

設(shè)f(i)表示[i..n]組成的十進(jìn)制數(shù)在模p意義下的值 那么f(i)-f(j)(j>i)就表示了[i..j-1]這一段區(qū)間表示的十進(jìn)制數(shù)擴大10的若干次冪之后在模p意義下的值 如果不考慮質(zhì)數(shù)2和5的話,擴大10的若干次冪是不應(yīng)響結(jié)果的,因為剩余的質(zhì)數(shù)都不是10的約數(shù) 那么如果要統(tǒng)計區(qū)間[l..r]有多少個子串滿足是p的倍數(shù)的話,只需要統(tǒng)計f(l)..f(r+1)這些數(shù)中有多少對數(shù)相同就行了 將f(i)離散化之后搞一個計數(shù)器然后直接莫隊就行了 然后特判一下2和5的情況,因為擴大了10的若干次冪,相當(dāng)于加了若干個質(zhì)因子2和5,不能像上面那樣求 但是其實2和5的情況更簡單 若p=2/5,如果某一個位上的數(shù)是能整除p,那它的后綴都是p的倍數(shù)都可以計算 然后搞一個前綴和每次查詢的時候減一下就行了

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define LL long long#define N 100005char s[N];LL p,suf[N],lsh[N],ans;int n,m,LSH,block,num[N],cnt[N];struct data{int l,r,id;LL ans;}q[N];int find(int x){ int l=1,r=LSH,mid,ans; while (l<=r) { mid=(l+r)>>1; if (x>=lsh[mid]) ans=mid,l=mid+1; else r=mid-1; } return ans;}int cmp(data a,data b){ return num[a.l]<num[b.l]||(num[a.l]==num[b.l]&&a.r<b.r);}void modui(int l,int r,int opt){ for (int i=l;i<=r;++i) { int x=suf[i]; ans-=(LL)cnt[x]*(cnt[x]-1)/2; cnt[x]+=opt; ans+=(LL)cnt[x]*(cnt[x]-1)/2; }}int main(){ scanf("%lld",&p); if (p==2||p==5) { scanf("%s",s+1);n=strlen(s+1); for (int i=1;i<=n;++i) if ((s[i]-'0')%p==0) cnt[i]=1,suf[i]=(LL)i; for (int i=1;i<=n;++i) cnt[i]+=cnt[i-1],suf[i]+=suf[i-1]; scanf("%d",&m); for (int i=1;i<=m;++i) { int l,r;scanf("%d%d",&l,&r); ans=suf[r]-suf[l-1]-(LL)(l-1)*(cnt[r]-cnt[l-1]);
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 岢岚县| 乐安县| 永福县| 东城区| 东辽县| 杨浦区| 柳州市| 西安市| 宜昌市| 简阳市| 巴青县| 通海县| 瓮安县| 康定县| 海安县| 额尔古纳市| 阳新县| 寿光市| 无锡市| 教育| 东安县| 庄河市| 札达县| 张家港市| 静乐县| 英吉沙县| 九江市| 五华县| 罗平县| 丽江市| 灵宝市| 宜黄县| 武清区| 临漳县| 上高县| 新疆| 鹰潭市| 肇庆市| 隆德县| 洱源县| 马鞍山市|