大致題意:給出n個數,問經過K次變換每個位置上的數變為多少。第i位置上的數經過一次變換定義為所有滿足 min( abs(i-j),n-abs(i-j) )<=d的j位置上的數字之和對m求余。
思路:
我們先將上述定義表示為矩陣
B =
1 1 0 0 1
1 1 1 0 0
0 1 1 1 0
0 0 1 1 1
1 0 0 1 1
B[i][j] = 表示i與j滿足上述關系,B[i][j] = 0表示i與j不滿足上述關系。根據這個矩陣,那麼樣例1中1 2 2 1 2經過一次變換變成了5 5 5 5 4。
其實這也是矩陣相乘的問題,令A = 1 2 2 1 2,那麼A * B = 5 5 5 5 4。那麼要經過K次變換,答案無疑是 A*(B^k)mod m。
用矩陣快速冪的復雜度為 O(n^3 * log k),n最大是500,K也很大,必會TLE。logk是不會變了,優化在於n^3。仔細觀察B矩陣,發現它是有規律的,它的每一行都是它上一行右移一位得到的。那麼在矩陣相乘時,我們只需計算第一行,然後整個矩陣就算出來了,這樣復雜度降為O(n^2 * log k)。
#include
#include
#include
#include
#include