P1397 [NOI2013]行列ゲーム

ポータル

もちろん、私たちは、電源の最初の瞬間を取ることができ、その後すぐに$ T $を飛びます

なぜなら、マトリックスは、したがって、オイラーが行列の数に下降することができ、問題の特殊な性質の見つかった問題の解決策を見てください

しかし、私は証明し理解していないので、私は暴力ファックを練習することにしました

その後、十進すぐに電源、および後方、定数だけでなく、行列乗算の順序を注意しません

#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath>
 使用して 名前空間STD。
typedefの長い 長いLL。
インラインint型リード()
{ 
    int型のx = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1CH =getchar関数(); }
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。}
     戻りのx *のF。
} 
のconst  int型 N = 1E6 + 7、MO = 1E9 + 7 チャーN [N]、M [N]。
構造体マトリックス{
     INT [ 3 ] [ 3 ]。
    行列(){memsetの(0はsizeof (a)参照)。} 
    インライン行列演算子(*CONST行列とTMP)のconst { 
        マトリックスRES。
        res.a [ 1 ] [ 1 ] =(1LL * [ 1 ] [ 1 ] * tmp.a [ 1 ] [ 1 ] + 1LL * [ 1 ] [ 2 ] * tmp.a [ 2 ] [ 1 ] )%のMO; 
        res.a [ 1 ] [ 2 ] =(1LL * [ 1 ] [ 1 ] * tmp.a [ 1 ] [ 2 ] + 1LL * [ 1 ] [ 2 ] * tmp.a [ 2 ] [ 2 ] )%のMO; 
        res.a [2 ] [ 1 ] =(1LL * A [ 2 ] [ 1 ] * tmp.aの[ 1 ] [ 1 ] + 1LL * A [ 2 ] [ 2 ] tmp.a * [ 2 ] [ 1 ])%のMo。
        res.a [ 2 ] [ 2 ] =(1LL * A [ 2 ] [ 1 ] * tmp.aの[ 1 ] [ 2 ] * 1LL + A [ 2 ] [ 2 ] * tmp.a [ 2 ] [ 2 ] )%のMo;
         // 定数ループアンローリングの最適化
        リターンRESを; 
    } 
} F.、G、アンス; 
マトリックスKSM(マトリックスX、チャー *のY)// 十进制快速幂
{ 
    マトリックスRES、T。res.a [ 1 ] [ 1 ] = res.a [ 2 ] [ 2 ] = 1 以下のためにint型 I =のSTRLEN(Y + 1); iが; i-- 
    { 
        T = X。
        もし(Y [I] == ' 9 '){T = Tの* tの、T = Tの*トン。T = Tの*トン。T = Tの*のX; RESの=の解像度* トン。}
         そう であれば(Y [I] == ' 8 '){T = Tの* tの、T = Tの*トン。T = Tの*トン。RESの=の解像度* トン。}
          のためのint型J = 1 ; J <= Y [I] - ' 0 ' ; J ++)RES = RES * X。
        t = xと; X = X * X; X = X * X; X = X * X; X = X * T; X = X * T; 
    } 
    戻りRESと、
} 
ボイドマイナス(チャー *秒)// 把数减一
{
     ためint型 I =のSTRLEN(S + 1 ; I i--) であれば(S [I] == ' 0 ')S [I] = ' 9 " ;
         {S [I] = sの[I] - 1破ります; } 
} 
int型メイン()
{ 
    int型、B、C、D。scanf関数(" %sの"、N + 1)。scanf関数(" %sの"、M + 1 )。= read()は、B =読み取る()、C =読み取る()、D = 読み取ります(); 
    Ans.a [ 1 ] [ 1 ] = Ans.a [ 1 ] [ 2 ] = 1 
    FA [ 1 ] [ 1 ] =。FA [ 2 ] [ 1 ] = B; FA [ 2 ] [ 2 ] = 1 
    GA [ 1 ] [ 1 ] = C。ジョージア[ 2] [ 1 ] Dを=。GA [ 2 ] [ 2 ] = 1 
    マイナス(N)マイナス(M)。
    F = KSM(F、M); G = F * G。G = KSM(G、N)。
    ANS = ANS * G * F。
    printf(" %Dを\ n "、Ans.a [ 1 ] [ 1 ])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11521638.html