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 ...