당신은 세 양의 정수에게 주어진 N , X , Y를 .
의 얼마나 많은 순열을 계산하십시오 1 ~ N은 다음과 같은 조건 (우리가 나타내는 만족 난 에 의해 순열의 번째 수를 P는 내가 :)
1. P 1 = X
2 페이지 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 ; }