Happy Necklace 矩陣快速冪

2021-09-29 02:10:34 字數 1637 閱讀 4924

the first line of the input contains an integer t(1≤t≤10000), denoting the number of test cases.

for each test case, there is a single line containing an integer n(2≤n≤1018), denoting the number of beads on the necklace.

for each test case, print a single line containing a single integer, denoting the answer modulo 109+7.22

334有一串長度為n的串,你用紅色或者藍色的珠子組成這個串,在任意乙個珠子的素數長度內紅色珠子永遠大於藍色珠子

現在的串長度為i,用k[i]來表示現在i這個長度的不同排列方法,那麼這個長度為i的串應該是怎麼得到的呢?

我們有兩種方法,放紅色,或者放藍色。

第一步我們選擇放紅色,那麼我們只要將i-1串的最後乙個放紅色就可以得到了

第二步我們放藍色,如果我們直接在i-1串的後面放藍色那麼有可能會存在連著倆個藍色(i-1串的最後乙個為藍色),所以不行。那麼我們用乙個紅色的放在藍色的前面(如果藍色是0,我們必須要先放1再放0,不能存在00),所以我們在i-2串後面放10(乙個紅色乙個藍色),但是會發現此時存在某種情況(010)藍紅藍也是不滿足題意的。所以我們也不能在i-2串後面放。我們再在i-3串後面放(010肯定不能放的)所以此時唯一可以放的情況是紅紅藍(110),那麼不管i-3串的最後一位是紅色還是藍色都是滿足條件的。

所以我們得到了i串得到的倆種方式,那麼k[i]=k[i-1]+k[i-3]

最後結論:發現這是乙個矩陣快速冪的題,規律是k[i]=k[i-1]+k[i-3]

構造矩陣:

我前面有乙個部落格是寫矩陣快速冪的可以參考:矩陣快速冪

a[3]a[2]a[1]乘乙個矩陣是a[4]a[3]a[2]

可得矩陣為

1 1 0

0 0 1

1 0 0

詳細**如下:

#include

using

namespace std;

#define ll long long

const

int n=3;

const

int mod=

1e9+7;

struct matrix};

matrix matrix_mul

(matrix a,matrix b)}}

return c;

}matrix matrix_pow

(matrix a,ll b)

while

(b) a=

matrix_mul

(a,a)

; b>>=1;

}return c;

}int

main()

matrix t1=

matrix_pow

(t,x-3)

; matrix t2=

matrix_mul

(tt,t1)

; cout<[0

]<}}

Happy Necklace(矩陣快速冪)

the first line of the input contains an integer t 1 t 10000 denoting the number of test cases.for each test case,there is a single line containing an ...

矩陣乘矩陣

7 15 矩陣a乘以b 15分 給定兩個矩陣a和b,要求你計算它們的乘積矩陣ab。需要注意的是,只有規模匹配的矩陣才可以相乘。即若a有r a 行 c a 列,b有r b 行 c b 列,則只有c a 與r b 相等時,兩個矩陣才能相乘。輸入格式 輸入先後給出兩個矩陣a和b。對於每個矩陣,首先在一行中...

spark矩陣向量 矩陣矩陣相乘

import org.apache.spark.util.val paramatrix1 sc.parallelize list vector 2,2,4 vector 3,2,1 vector 1,3,2 首先,在spark shell中將乙個矩陣按照行進行並行化,val vec1 vector ...