4542 Hnoi2016 大數 莫隊演算法

2021-07-11 09:28:01 字數 1345 閱讀 2306

555我好弱啊

都說今年的hnoi是無腦資料結構賽,都很好想只是碼**的問題,然而我還是不會做這道題。

要退役了啊啊啊。

首先我們令si

表示以i 為開頭的字尾形成的數字。 對於p

≠2且p

≠5的時候,我們可以發現,若存在l,

r ,滿足sl

≡sr+

1(modp

) ,則區間[l

,r] 組成的數字一定是

p 的倍數,那麼問題轉化為求區間中有多少相同的數的對數,就可以用莫隊演算法來解決了。 當p

=2或p

=5的時候,預處理一下就好了。

#include

#include

#include

#include

#include

#include

using namespace std;

const int n=100005;

int n,m,cnt,block;

long long p,ans;

char str[n];

int belong[n],id[n],num[n];

long long s1[n],s2[n];

long long s[n],ans[n];

mapint> mp;

struct query

q[n];

inline long long read()

while (c>='0'&&c<='9')

return a*f;

}inline bool operator<(query a,query b)

inline void solve()

}int main()

block=(int)sqrt(n);

for (int i=1;i<=n;i++)

belong[i]=(i-1)/block+1;

long long base=1;

for (int i=n;i;i--)

for (int i=1;i<=n+1;i++) id[i]=mp[s[i]];

m=read();

for (int i=1;i<=m;i++)

q[i].l=read(),q[i].r=read()+1,q[i].id=i;

sort(q+1,q+m+1);

int l=1,r=0;

for (int i=1;i<=m;i++)

for (int i=1;i<=m;i++)

printf("%lld\n",ans[i]);

return

0;}

bzoj4542 Hnoi2016 大數 莫隊

小 b 有乙個很大的數 s,長度達到了 n 位 這個數可以看成是乙個串,它可能有前導 0,例如00009312345 小b還有乙個素數p。現在,小 b 提出了 m 個詢問,每個詢問求 s 的乙個子串中有多少子串是 p 的倍數 0 也 是p 的倍數 例如 s為0077時,其子串 007有6個子串 0,...

BZOJ4542 Hnoi2016 大數 莫隊

小 b 有乙個很大的數 s,長度達到了 n 位 這個數可以看成是乙個串,它可能有前導 0,例如00009312345。小b還有乙個素數p。現在,小 b 提出了 m 個詢問,每個詢問求 s 的乙個子串中有多少子串是 p 的倍數 0 也是p 的倍數 例如 s為0077時,其子串 007有6個子串 0,0...

HNOI2016 大數(number)《莫隊》

一道典型的莫隊。先預處理出字尾,即f i 表示i n 1 mod p 的值.但p的值不小,顯然不能直接存,加乙個離散化。觀察題目,發現一串數s l r 整除p滿足s l n 1 p s r 1 n 1 p 但p值為2或5不滿足這個性質需要特判 不過資料中好像沒有,於是筆者沒寫,有興趣的可以自己去寫寫...