P4345 SHOI2015 超能粒子炮改

2022-04-10 06:57:08 字數 1756 閱讀 8007

洛谷

曾經發明了腦洞**儀與超能粒子炮的發明家 shtsc 又公開了他的新發明:超能粒子炮・改——一種可以發射威力更加強大的粒子流的神秘裝置。

超能粒子炮・改相比超能粒子炮,在威力上有了本質的提公升。它有兩個引數 n,k ,它會向每個編號為 0 到 k (包含兩端)的位置i發射威力為 \(c_^ \bmod 2333\)的粒子流。

現在 shtsc 給出了他的超能粒子炮・改的引數,讓你求出其發射的粒子流的威力之和除以 2333所得的餘數。

資料範圍: 對於 100% 的資料,\(t=100000\) , \(n,k \le 10^\).

首先,這道題可以用盧卡斯加大力吸氧得到50分。

然後,無論怎麼調都會tle。

那麼我們就要開始想正解。

我們要求的是這個柿子

\(\displaystyle\sum_^c_^ \bmod 2333\)

我們可以用lucas定理換一下變成

\(\displaystyle\sum_^c_^c_^\bmod p\)

然後,我們就會神奇的發現,\(c_^\)重複計算了好多次

我們發現從0-p-1到p-2p-1.....他們中間都有一段連續的\(\displaystyle\sum_^c_^\)

這樣,我們就可以先計算這些段出現了多少次

就是 \(\displaystyle\sum_^c_^ \times \displaystyle\sum_^ c_^\)

對於剩下的一些散塊,我們直接可以套用盧卡斯定理來求。

也就是 \(\displaystyle\sum_^c_^\times c_^\)

對於這個\(\displaystyle\sum_^c_^\)柿子,我們可以通過預處理出[0,p-1]的組合數的字首和搞出來。

\(\displaystyle\sum_^ c_^\)這個柿子呢,我們就可以直接遞迴處理。

\(\displaystyle\sum_^c_^ \bmod 2333\)

=\(\displaystyle\sum_^c_^c_^\bmod p\)

=\(\displaystyle\sum_^c_^ \times \displaystyle\sum_^ c_^\)+ \(\displaystyle\sum_^c_^\times c_^\)

=\(f(n \bmod p,p-1) \times f(n \bmod p,k/p-1) + c_^ \times f(n \bmod p,k \bmod p)\)

其中 \(f(x,y)\) = \(\displaystyle\sum_^c_^\)

#include#include#includeusing namespace std;

#define ll long long

const int p = 2333;

ll t,a,b,c[2550][2550],f[2550][2550];

inline ll read()

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

return s * w;

}ll lucas(ll n, ll m)//lucas定理求組合數

ll calc(ll n,ll k)

void yych()//預處理出0-p的組合數

} for(int i = 0; i <= 2500; i++) f[i][0] = 1;

for(int i = 0; i <= 2500; i++)//組合數的字首和 }

}int main()

return 0;

}

P4345 SHOI2015 超能粒子炮 改

傳送門 看到資料和模數大小就知道要上 lucas 了 然後開始愉快地推公式 答案為 sum kc mod 2333 設 f i j sum jc mod 2333 p 2333 那麼根據 lucas 定理得 f n k sum k c 看到 i p 容易想到整除分塊,那就把 i p 相同的塊提出來看...

SHOI2015 超能粒子炮 改

設 f n k sum kc n i pmod 那麼根據盧卡斯定理我們知道 f n k sum kc times c c 0 times sum c i c 1 times sum c i c times sum c i c times sum c i sum c i times c 0 c 1 c...

SHOI2015 超能粒子炮 改

求 sum 2333 n,k leq 10 如果直接套盧卡斯還是比較容易想到分塊求解的 由 c n i c times c 可知,i p 相同的組合數另一部分分別是 i p,i p 1,i p 2.這部分可以搓到一起 令 s n k sum 具體來說,將這部分相同的部分放到一起,剩下的地方直接計算 ...