トピックポータル
ソル:
私は実際には別のソリューションを発売し、長い時間を押して、それをプッシュすることはできません問題への単純な控除公式ソリューション。
C [4] [1] = F、Cで表される[I] [J] [i]はアイテムjに、例えば[3] [0]、F [0] * F [3] = 0 = C [1] * [3] 2 = F。
[N]がC [n]が[0] + C [N] [1] + ... + C [N] [N]である我々見つけます。
C [n]が[0]、F [0] * F [N] = fは= [0] * F [N - 1] + F [0] * [N - 2] F [N - 1] = Cを[0 N] + C [ - 2] [0]。
C [N] [1] = F [1] * F [N - 1] = F [1] * F [N - 2] + F [1] * [N - 3] F = C [N - 1] [1] + C [N - 2] [1]。
[N - 1]が、[N]、[N - 2]アイテムの数と一致しない; - [2 N] + - [1、N] = [N]に記載されていているように見えます。
C [N] [N] = F [N] * F [0] = F [N] * F [-1] + F [N] * [-2]、使用することができないfはここで、C [N - 1] [N]、及び[N - 2]、C [n]が示されているが、F [0] = 0、そう[N] C [N] = 0;は無視することができます。
fは[1] = 1、Cように[N] [N - 1]ので、F = [Nを - 1] * F [1] = F [N - 1]。
C [N - 1] [N - 1]は0に等しいです。
したがって、[N] [N - 1] = + [N - 1] +のF [N - 1]次に、被験者こと迅速マトリックス累乗を使用して解決することができます。
- 高速電力行列
#include " ビット/ STDC ++ H。" 使用 名前空間STDを、 typedefの長い 長いLL。 const int型 MOD = 998244353 ; 構造体マット{ int型のマット[ 5 ] [ 5 ]。 マット(){memsetの(マット、0、はsizeof (マット));} 友人マット演算子 * (マットbをMAT){ マットC。 用(int型のk = 1 ; K <= 4 ; ++ k個) のために(int型 I = 1 ; 私は= < 4。I ++ ) のための(INT J = 1 ; J <= 4 ; J ++ ) c.mat [I] [J] =(c.mat [I] [J] + 1LL * a.mat [I] [K] * B .MAT [K] [J])%MOD。 リターンC; } }。 マットmat_pow(マットN、LLのK){ マットANS。 以下のために(int型 i = 1 ; iは= < 4 ; I ++ ) ans.matを[I] [I] = 1 。 一方、(K){ 場合(K&1)ANS = ANS * N。 N = N * N; K >> = 1 。 } 戻りANS。 } int型{main()の LL N。 scanf関数(" %のLLD "、&N) マットM。 m.mat [ 1 ] [ 1 ] = m.mat [ 1 ] [ 2 ] = m.mat [ 1 ] [ 3 ] = 1 。 m.mat [ 2 ] [ 1 ] = m.mat [ 4 ] [ 3 ] = 1。 m.mat [ 3 ] [ 3 ] = m.mat [ 3 ] [ 4 ] = 1 。 M = mat_pow(M、N - 1 )。 printf(" %d個の\ n "、m.mat [ 1 ] [ 3 ])。 リターン 0 ; }