嘗試用Markdown寫一篇博客
3142: [Hnoi2013]數列
Description
小T最近在學着買股票,他獲得內部消息:F公司的股票將會瘋漲。股票天天的價格已知是正整數,而且因爲客觀上的緣由,最多隻能爲N。在瘋漲的K天中小T觀察到:除第一天外天天的股價都比前一天高,且高出的價格(即當天的股價與前一天的股價之差)不會超過M,M爲正整數。而且這些參數知足M(K-1)<N。
小T忘記了這K天天天的具體股價了,他如今想知道這K天的股價有多少種可能。
Input
只有一行用空格隔開的四個數:N、K、M、P。對P的說明參見後面「輸出格式」中對P的解釋。
輸入保證20%的數據M,N,K,P≤20000,保證100%的數據M,K,P≤10^9,N≤10^18 。
Output
僅包含一個數,表示這K天的股價的可能種數對於P的模值。
Sample Input
7 3 2 997
Sample Output
16數組
首先來說講我是怎麼作(鬼)出這道題的。
沒錯就是打表。
對上次考試打完表沒看出1,2,6,24是階乘的事情耿耿於懷的我決定用打表作出這道一看就是打表題的題。
首先我花了20分鐘碌碌無爲,對於答案f(n,k,m)打了一個小表,什麼都沒有發現。
20分鐘左右我開始固定k和m,移動n。
實驗了幾組k在2~4的數據後發現從n到n+1,答案會增加m^(k-1)。
試到30分鐘,總結出:規律是在n=m(k-1)處開始的。code
而後我打了關於k,m的f(m*(k-1),k,m)的表,即臨界表。
大概長這個樣子:ip
k\m 2 3 4 5 2 1 3 6 10 3 4 18 48 100 4 12 81 288 750 5 32 324 1536 5000
第一眼看過去沒什麼規律?
亂搞到40分鐘,發現第k行的都能被(k-1)整除,除掉再看:博客
k\m 2 3 4 5 2 1 3 6 10 3 2 9 24 50 4 4 27 96 250 5 8 81 384 1250
發現每一列下來都是乘以m?因此只要看第一列。io
m 2 3 4 5 1 3 6 10
相差是個等差數列,那就是個二次多項式了。
這時規律就比較明顯了:(m-1)*m/2。
而後再整理一下就會獲得答案:class
50分鐘不到開打,一個小時不到就作完了。
放在省選裏面這個時間是能夠接受的(NOIPT2也是1h左右吧?)。總結
這個時候咱們不能知足是吧?要知道正解是什麼。
第一步:將原數組差分,獲得k-1個[1,m]內的正整數a[1…k-1]。
第二步:當前方案數即爲n-sum(a[1] to a[k-1])。
因此總的方案數就是sum(n-sum(a[1] to a[k-1]))。
把n提出來,爲n×m^(k-1)。
而後後面那個東西,網上的理解我推不出來,是要對於每一個東西單獨考慮?不會。數據