C ++ - POJ3735-トレーニングはほとんどの猫[行列の乗算] [クイックパワー]

主にテスト建設への高速パワー・マトリックス、。また、スワップは常に小さな志向を書くのか?

なぜ?ただあきらめます。ああ、私はあまりにもハードでした。

アイデア: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 }

 

おすすめ

転載: www.cnblogs.com/JasonCow/p/12359789.html