沉默是金 矩阵快速幂
沉默是金
時間限制:?1 Sec??內存限制:?128 MB
題目描述
終于活成了自己最討厭的模樣。
小希遇到了一個序列,他現在可以在序列中可以有重復地取k個數組成一個新的序列。該序列有以下幾個性質:
1、長度為k;
2、序列中的數字滿足相鄰兩個數字異或后的二進制數字中1的個數是3的倍數。
一共有多少個滿足條件的序列?
輸入
有多組測試樣例。
第一行兩個數n,k代表給定序列的長度和待取序列的長度。
接下來一行n個數字,代表給定序列。
輸出
每個答案一行,輸出滿足條件的序列的個數。答案模1000000007
樣例輸入
5 2 15 1 2 4 8 10 1 44 65 23 44 100 19 19 23 19 40 10 2 93 93 85 48 44 98 93 100 98 98 10 100 22 0 41 63 22 41 17 22 15 42 10 1000000000 454240622 216977025 454240622 509843007 509843007 26552516 488949284 708817573 453191950 447767457樣例輸出
13 10 52 205668186 108319885題意:
給定序列,從序列中選擇k(1≤k≤1e18)個數(可以重復選擇),使得得到的排列滿足xi與xi+1異或的二進制表示中1的個數是3的倍數。問長度為k的滿足條件的 序列有多少種?
分析:
首先每個元素自己構成一個長度為1的滿足條件的序列。?
其次我們可以預處理出滿足條件的vi,vj,就可以得到一個橫縱為n的01矩陣。此時我們得到了以vi開頭,vj結尾的長度為2的序列個數。?
接下來我們發現,兩個矩陣相乘,矩陣c為新得到的矩陣,此時矩陣a=b,c[i][j]=a[i][1]?b[1][j]+a[i][2]?b[2][j]+...+a[i][n]?b[n][j],我們得到的即為以ai開頭,aj結尾的長度為3的序列個數!?
接下來用矩陣c更新矩陣a,再與最初的01矩陣,即b相乘,得到的又為開頭元素為ai,結尾元素為aj的長度為4的序列個數!?
依次乘k?1次即得到結果,這部分可以用矩陣快速冪進行優化。?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的沉默是金 矩阵快速幂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU5726 线段树求解区间GCD
- 下一篇: 史前文明 组合数学