あなたは、3つの正の整数与えられている N 、X 、Y。
順列の数を計算してください 1 〜Nは、 以下の条件(我々は示し満足 Iによる順列の数番目 のP Iを:)
1 、P 1 = X
2 P N = Y
全て3. 1 ≤ iが< Nを、 | P I - P I + 1 | ≤ 2
質問の意味:
N、X、Yを与えます。Qは、Xで始まる、yは終了され、配置されているどのように多くのプログラムこれ以上〜1よりもN 2 2隣接の数の差。
アイデア:
AIは、AI-1であってもよい、AI-2は、1 + AI、+ 2愛。AIが小さくなると、パスが固定されている(だけ小さいに渡ってジャンプすることができ、それ以外の場合はバックAI + 1に変更することが不可能である)、および配列における小さな数に入れなければならないが、その後、+ 1に戻されます。配置された番号の残りのために、そうでない場合は、シーケンスに少数ではありません。
だから、同様に、Y!時間= N、背面からの配列は、Y 1が大きいと小さくなければなりません。
X + 1〜Y-1は、多くの種類の状態が配置されている満たすために問題があります。
i番目のビットのための愛:私は、+ 1ビットは、ビット+ 1又はAI + 2を愛であってもよいです。
1:I + 1番目のビットが1 + aiをするとき、議論がダウン継続することができます。
2:I + 1番目のビットは必ずしも+ 1アイの+ 2、I + 2ビットを愛場合、ビットのI + 3がai + 3でなければなりません。そうしないと、後で戻ってビットAI + 1、死者左で行きたいのですが、戻って行くことができない場合。
以上のことから、I-3及びI-1ビットのi番目のビットが到達することができます。フィボナッチをf [I] = F [I-1]、本明細書で使用される+ Fの[I-3](F [1] = F [2] = F [3] = 1)。
要約すると:
1:X == 1つの&& Y == N ..... ANS = F [N]。
2:X == 1 && Y = N ....... ANS = F [Y-1];!
3:X = 1つの&&のy == N ....... ANS = F [NX];!
4:!X = 1 && Y = N ...... ANS = F [YX-1]。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いっCONST = LL MOD 998244353 。 LL nを、X、Y。 LL [ 100005 ]。 ボイド楽しい(){ ため(LL I = 4 ; iは= < 100000 ; iは++ ) { [I] =([I- 1 ] + [I- 3 ])%MOD。 } } int型のmain() { int型のT。 イオス:: sync_with_stdio(偽); cin.tie(0 )。 cout.tie(0 )。 [ 1 ] = 1 ; [ 2 ] = 1 ; [ 3 ] = 1 。 楽しいです(); cinを >> トン。 一方、(t-- ) { CIN >> N >> X >> Y。 もし(Xの== 1つの && Y == N)COUT << [N] << ENDL。 他の 場合(Xの== 1)COUT << [Y- 1 ] << ENDL。 そう であれば(Y == N)COUT << [NX] << ENDL。 他 COUT <1endl; } 戻り 0 。 }