(拖更N天終於想起來我還有博客 )
(校內模擬的題面&代碼聯賽後解除封印~)
題解
1.0 認(hu)真(luan)分析
一開始看這道題看了半天,還以爲是什麼區間查詢之類的題,後來認認真真讀了讀樣例,才理解過來——這是個組合數學題!
當且僅當存在至少一個環節,選擇的書不同,或者在同一本魔法書上選取的咒語不一樣。
這不就是組合數嘛……
分攤到每一步上,在 li 處有 li-k+1 種選擇,在 li+1 處有 li+1-k+1 種選擇……然後最後在 ri 處有 ri-k+1 種選擇。
又因爲l到r是連續的一段區間,所以每一步的方案數可以表示如下:
(借用於ZXY大佬的blog,%%%其實是我打不來)
按照這個式子預處理一波階乘和逆元,可以得到60分。
1.1正解
我們發現,剛纔之所以拿不了滿分,主要是在計算上花了很多時間。
那麼我們可以把式子簡化一些嗎?
下面又是蒟蒻的我想不到的了
(再次借用於%%%神仙zxy的博客 )
我們要運用一些組合數學的定理:
然後……
然後變成這樣就非常方便了對吧?
這樣一來,對於每一次個l和r,我們只需要計算兩個值就可以求出這一段的方案總數,也就是O(1)的處理時間。預處理本身也只需要O(N)不到的複雜度。
於是,我們就開心的A掉這道題了~
總結:
組合數學一直是數論專題的重要考點之一,對於這方面的各種推論和運用,我們需要記住幾個常用的定理和公式,一般就能保證自己做題時思路的正確性了。
還有重要的一點(就是我今天掛掉的主要問題 ),取模運算時一定要把除法轉化爲乘上逆元!要不然就算你的算法正確也照樣GG了~