1. 程式人生 > >【莫隊】bzoj4542: [Hnoi2016]大數

【莫隊】bzoj4542: [Hnoi2016]大數

素數 可能 位置 意思 應該 十進制 常見 ber zoj

挺有意思的,可以仔細體味一下的題;看白了就是莫隊板子。

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個詢問的答案。


題目分析

一個區間[l,r]產生貢獻即$number_{i,j}\equiv 0\ ({\rm mod}\ p)$.

按照常見套路來說,應該把區間拆成關於端點的式子。用$pre[i]$表示前$i$位在十進制下的數值,那麽即$number_{i,j}=pre[j]-10^{j-i+1}*pre[i-1]$

【莫隊】bzoj4542: [Hnoi2016]大數