主にテスト建設への高速パワー・マトリックス、。また、スワップは常に小さな志向を書くのか?
なぜ?ただあきらめます。ああ、私はあまりにもハードでした。
アイデア:E及びSは、主に操作グラムミス操作されています
私たちは、この余分な1を計算することができ、1で示される、1を追加するたびに、追加して空にすることができます
、A = [1 0 0 ... 0]を定義するかもしれない長い等価行列Tのような一連の操作として、この時点で構成されています
TIMはタプルに初期行列A N + 1の一つであり、nは0〜番号。3匹の猫実施例[1000]
1の#include <cstdioを> 2のtypedef 長い 長LL。 3 のconst int型 N = 105 。 4 整数N、M、K; LL T。 5 構造体マトリックス{LL [N] [N];} O、I。 6 ボイドOI(){ 7 用(INT iは= 0 ; iは<Nは、I ++ ) 8 用(INT J = 0 ; J <N; J ++ ) 9 OAは[i] [j]は= 0、IA [I] [ J] =(I == j)は、 10 } 11 マトリックスムル(行列A、行列B){ 12 行列C = O。 13 のための(int型のk = 0 ; K <= N; K ++ ) 14 のための(INTは iは= 0 ; I <= N; I ++ ) 15 であれば(AA [I] [K])// 注意这个优化 16 のために(INT J = 0 ; J <= N; J ++ ) 17 CA [I] [J] + = Aaの[I] [K] * のBa [K] [J]。 18 リターンC。 19 } 20マトリックスパウ(行列A、INT N){ 21 行列B = I; 22 のために(; N; A =ムル(A、A)、N >> = 1)であれば(N - 1)B = ムル(B、A)。 23 リターンB。 24 } 25マトリックスmakeA(){行列A = O; Aaの[ 0 ] [ 0 ] = 1 ; リターンA;} 26 マトリックスmakeT(){ 27 マトリックスT = I。チャー S [ 5 ]。int型、B、I。 28 一方(k-- ){ 29 のscanf(" %sの%D "、S、& )。 30 であれば(S [ 0 ] == ' G ')は、TA [ 0 ] [A] ++ ; 31 他の 場合(S [ 0 ] == ' E ')のための(iは= 0 ; <I = N; I ++)のTa [i]は[A] = 0 ; 32 他 のため(のscanf(" %dの"、およびb)は、iが= 0 ; I <= N; I ++)T = Taの[i]は[A]、Taの[i]は[A] = Taの[I]、[B] 、Taの[I] [B] = T。 33 } 34 リターンT。 35 } 36 int型のmain(){ 37 OI(); 38 一方(scanf関数(" %D%D%D "、&N、&M、&K)!= EOF){ 39 であれば(N == 0 && M == 0 && K == 0)ブレーク。 40 行列A = makeA()、T = makeT(); A = ムル(A、パウ(T、M))。 41 のために(INT iは= 1 ; iが<= N; I ++)のprintf(" %のLLD "、Aaの[ 0 ] [I])。 42の プット("" )。 43 } 44 リターン 0 。 45 }