2019沙南昌まずラウンドオンラインプログラミングコンテスト、-H

アイデア:パワーマトリックス速い+マップ

コード:

#include <cmath> 
の#include <アルゴリズム> 
の#include <cstdioを> 
する#include <地図>
 のconst  int型 INF = 0x3f3f3f3f const  int型 MAXN = 1E7 + 10 const  int型のmod = 998244353 ;
使用して 名前空間はstdを、
typedefの長い 長いLL。
マップ <-1,11,11-> 融点; 
LLのn; 
構造体マット
{ 
    LLのM [ 4 ] [ 4 ]。
}単位; 
マット演算子 *(のconstマットと、CONSTマット&B)
{ 
    マットQ。
    QM [ 1 ] [ 1 ] =(AM [ 1 ] [ 1 ] * BM [ 1 ] [ 1 ] +午前[ 1 ] [ 2 ] * BM [ 2 ] [ 1 ])%MOD。
    QM [ 1 ] [ 2 ] =(AM [ 1 ] [ 1 ] * BM [ 1 ] [ 2 ] +午前[ 1 ] [ 2 ] * BM [ 2 ] [ 2 ])%MOD。
    QMの[ 2] [ 1 ] =(AM [ 2 ] [ 1 ] * BM [ 1 ] [ 1 ] +午前[ 2 ] [ 2 ] * BM [ 2 ] [ 1 ])%MOD。
    QM [ 2 ] [ 2 ] =(AM [ 2 ] [ 1 ] * BM [ 1 ] [ 2 ] +午前[ 2 ] [ 2 ] * BM [ 2 ] [ 2 ])%MOD。
    戻るQを。
} 
マットF、ANS。
LLのpow_mat(MAT、LL N)
{ 
    場合(mp.count(n))をリターンMP [n]は、
    LLのTEMP = N。
    一方、(N)
    { 
        場合(N - 1 
        { 
            N - 
            F = F * ; 
        } 
        N >> = 1 
        A * = 
    } 
    戻り MP [TEMP] = FM [ 1 ] [ 1 ]%のMOD。
} 
LL KK [MAXN]。
INT メイン()
{ 
    LL Q、N。
    scanf関数(" %のLLDの%のLLD "、&​​Q& N)。
    LL TMP= N;
    以下のためにint型 i = 0 ; iはQを<; iは++ 
    { 
        FM [ 1 ] [ 1 ] = 1 
        FM [ 1 ] [ 2 ] = 0 
        ans.m [ 1 ] [ 1 ] = 3 ; 
        ans.m [ 1 ] [ 2 ] = 1 
        ans.m [ 2 ] [ 1 ] = 2 ; 
        ans.m [ 2 ] [ 2 ] = 0; 
        LL NN = pow_mat(ANS、tmp- 1 )。
        KK [I] = NN%のMOD。
        TMP ^ =(NN * NN)。
    } 
    AA LL =のKK [ 0 ]。
    int型 i = 1 ; iがQを<Iは++ 
    { 
        AA ^ = KKの[iが]。
    } 
    のprintf(" %LLDする\ n "、AA%のMOD)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/kayiko/p/11487363.html