マルチ第五1007順列2019hduのサマースクール2 HDU - 6630

あなたは、3つの正の整数与えられている  N X Y
順列の数を計算してください  1 Nは、  以下の条件(我々は示し満足  Iによる順列の数番目  のP Iを:)

、P 1 = X

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 
 }

 

おすすめ

転載: www.cnblogs.com/yzxqq/p/11307918.html