行列高速電力--HDU5667

トピックリンク

ブログに書くのが面倒紙の上で完全な分析、

私はこんにゃくです、唯一のソースコード

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include < 文字列の.h>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
const  int型 MAXN = 107 ; 
LLモッズ; 
構造体マット{ 
    LLのM [MAXN] [MAXN]。
    INT X、Y。/// X是行数Y是列数
}手段と
ボイドinit_unit(){ 
    memsetの(unit.m、0はsizeof (unit.m))。
    int型 iは= 0 ; iがMAXNを<Iは++ 
        unit.m [i]は[I] =1 ; 
} 
ボイドショー(マットA){
     ためint型 i = 1 ; iが= AXを<; Iは++ ){
         ためINT J = 1 ; J <= AY; J ++ 
            のprintf(" %dの" 、午前[I] [J ]); 
        printf(" \ nを" ); 
    } 
} 
マットmat_mul(マットA、マットB){ 
    マットC。
    CX = AX、CY = によって、
    memset(CM、0はsizeof (CM))。
    以下のためのint型 I = 1; I <= CX; I ++ のためのINT J = 1 ; J <= CY; J ++ ){
         ためのint型のk = 1 ; K <= AY; K ++ ){ 
            CM [I] [J] + =(AM [ I] [K] * BM [K] [J])%(mod- 1 )。
            CM [I] [J]%= mod- 1 
        } 
    } 
    戻りC。
} 
マットmat_QuickPow(LL bをMAT){ 
    マットANS = 手段と 
    ans.x =斧、ans.y = AY。
    一方、(b)は、{
         もし、(B&1 
            ANS = mat_mul(ANS、A)。= mat_mul(A)。
        B >> = 1 
    } 
    戻りANS。
} 
LL QuickPow(LL、LL b)は{ 
    LL ANS = 1 一方、(B){
         場合(B&1(A ANS *)%)ANS = MOD。=(* A)%MOD。
        B >> = 1 
    } 
    戻りANS。
} 
int型Tと、
LL N、X、Y、Z。
INT メイン(){ 
    scanf関数(" %dの "、&T); 
    init_unit(); 
    一方、(t-- ){ 
        scanf関数(" %I64d%I64d%I64d%I64d%I64d "、&​​N、およびX&Y、およびZ、&MOD)。
        マット; 
        AX = AY = 3 
        AM [ 1 ] [ 1 ] = 1、午前[ 1 ] [ 2 ] = Y、午前[ 1 ] [ 3 ] = 0 ; 
        AM [ 2 ] [ 1 ] = 0、午前[ 2 ] [ 2 ] = Z、午前[ 2 ] [ 3 ] =1 ; 
        AM [ 3 ] [ 1 ] = 0、午前[ 3 ] [ 2 ] = 1、午前[ 3 ] [ 3 ] = 0 ;
        もし(N == 1 ){ 
            のprintf(" 1 \ n " );
            続け; 
        } 
        であれば(N == 2 ){ 
            のprintf(" %I64dの\ n " 、QuickPow(X、Y))。
            続け; 
        } 
        A = mat_QuickPow(N-2); 
        LLさt =(AM [ 1 ] [ 2 ] +午前[ 2 ] [ 2 ] * Y)。
        printf(" %I64dの\ n " 、QuickPow(X、T))。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/helman/p/11323639.html