2019hdu 여름 학교 다 다섯 번째 1007 순열이 HDU - 6630

당신은 세 양의 정수에게 주어진  N , X , Y를 .
의 얼마나 많은 순열을 계산하십시오  1 ~ N은  다음과 같은 조건 (우리가 나타내는 만족  에 의해 순열의 번째 수를  P는 내가 :)

1.  P 1 = X

페이지 N = y를

모든 3.  1 i가 < N을| p는 내가 - p는 내가 + 1 | 2

질문의 의미 :

N, X, Y를 준다. X에서 Q의 시작은, Y는 말단과 더 1보다 2 인접한 2의 수의 차이 ~ N은 얼마나 많은 프로그램하여 배치되어있다.

아이디어 :

AI를 들어, AI-1에있을 수 있고, AI-2, 1 + AI, + 2 인공 지능. AI가 작아지면, 경로 (그렇지 않으면 다시 AI + 1로 변경하는 것이 불가능하다, 단지 작은 가로 질러 이동할 수있다) 다음 + 1로 복귀 순서 소수 투입해야 고정되고 배열 수의 나머지, 그렇지 않은 경우에는 순서로 소정 수 없다.

그래서 마찬가지로, Y! 시간 N, 뒤에서 순서는 Y-1을 더 작아야 =.

X + 1 ~ Y-1은 여러 가지의 조건이 충족되는 배열에 대한 문제이다.

i 번째 비트 인공 지능 : 전 비트 1 + 인공 지능 또는 AI + 2 1 비트 일 수있다 +.

1 : I + 1 번째 비트 + 1 인공 지능 때, 토론 아래로 계속 사용할 수 있습니다;

2 : 반드시의 I + 1 번째 비트는 인공 지능 + 2 + i가 2 비트 AI + 3이어야 비트로 + 1, + 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 == ..... ANS N = F [N];

2! X == 1 && Y = N ....... ANS = F [Y-1];

3,2 : X = 1 개, Y && == N ....... ANS = NX] F;

! 4! && X = 1, Y = N ...... ANS = F [YX-1];

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
#DEFINE 어떠냐 오래 오래 CONST의 게요 모드 = 998244353 ; 
LL의 N, X, Y; 
LL이 [ 100005 ];
보이드 재미 () {
     대해 (LL I = 4 ; 나는 = < 100000 ; 내가 ++ ) 
    { 
        A [I] = (A [I- 1 ] + A [I- 3 ]) % 개조; 
    } 
} INT 의 main () 
{ INT의 t; 
    IOS :: sync_with_stdio ( 거짓 ); 
    cin.tie ( 0



    

     );
    cout.tie ( 0 ); 
    A [ 1 ] = 1 , A는 [ 2 ] = 1 , A [ 3 ] = 1 ; 
    장난(); 
    CIN >> t;
    반면 (t-- ) 
    { 
        CIN >> N >> >> X , Y;
        경우 (엑스 == 1 && Y == 않음) COUT << A [N] << ENDL;
        다른  경우 (엑스 == 1 ) COUT << A [Y- 1 ] << ENDL;
        다른  경우 (예를 == 않음) COUT << A [NX] << ENDL;
        다른 cout을 <ENDL; 
    } 
    반환  0 ; 
 }

 

추천

출처www.cnblogs.com/yzxqq/p/11307918.html