矩阵快速幂之Kiki & Little Kiki 2

質問の意味がある:01シリーズの文字列、毎秒与えられ、すべての位置は、左が1であれば、あなた自身の状態が変更されます(最初は最後の一つとして残っていた)、ライトが状態を離れたランプに応じて変更する必要があります左は状態を変更するには0、Q nの文字列01秒ではありません

/////

まず、A [2] =([1] + [2])%2、ことを見出しました;

行列は速い結果の電力を計算するために使用することができます。

我々が見つかりました。

(1 + 1)ライン上^ 1 2及び結果として1%、及び1 * 1 1 1と同じ結果ので、乗算機能変化

コード:

#include <ビット/ STDC ++ H>
名前空間STDを使用して、
typedefの長い長いLL。
const int型のmod = 1024;
文字列str [110]。
int型のlen;
構造体ノード{
INT [101] [101]。
}。
ノードa、ANS、B。
INITを無効()
{
///我们令F(I)*はF(I-1)+のB * Fを(I-2)=、下面举例A = 3、B = 2。
memset(AA、0、はsizeof(AA))。
以下のために(INT i = 1; iがLEN <; iは++)AA [I] [i]は= AA [i]は[I-1] = 1。
AA [0] [0] AAを= [0] [lenの-1] = 1。
}
ノードマット(ノードX、ノードY)
{
ノードc。
以下のために(INT i = 0; iがLEN <; I ++)
のための(INT J = 0; J <LEN; J ++)
CA [I] [J] = 0;
以下のために(INT i = 0; iがLEN <; I ++)
のための(INT J = 0; J <LEN; J ++)
のための(INT K = 0; K <LEN; ++ K)
CA [I] [J] = CA [I] [J] ^(1LLの*第Xa [I] [K]&y.a [K] [J])。
// printfの( "はい\ N");
Cを返します。
}
メインINT()
{
LL N。
int型T;
(〜のscanf( "%D%s"は、&​​N、STR)){一方
でlen =のSTRLEN(STR)。
その中に();
以下のために(INT i = 0; iがLEN <; I ++)///
ため(INT J = 0; J <LEN; J ++)///
BA [I] [J] = 0; ///
ため(INT I = 0; iがLEN <; iは++)///这里就只是为下面快速幂提供用的
BA [i]は[I] = 1。
一方、(N){
IF(N - 1)B =マット(B、A)。
=マット(A)。
N >> = 1。
}

以下のために(INT i = 0; iがLEN <; iは++){
ans.a [I] [0] = STR [I] - '0'。
}
ANS =マット(B、ANS)。
以下のために(INT i = 0; iがLEN <; iは++)
COUT << ans.a [I] [0]。
coutの<<てendl;
}
0を返します。
}

 

おすすめ

転載: www.cnblogs.com/hgangang/p/11506510.html