기술
전설은 오래 전,이 땅에서 신비한 생물들이 살고 : 고블린. 고블린은 끝없는 산에서 살고 싶어. 좌우가 섹션으로 분할 될 수로부터 하이 1 및 N. 사이의 양의 정수이고 구체적으로는, 산 길이 N H N은 각각 하이 고유 높이가 산의 조각은 주변 산의 모든보다 높은 경우, 다음이 산 피크입니다. 산 일부 인근 산의 가장자리에 위치하고 있으며, 다른 두 (즉, 왼쪽 및 오른쪽)이 있습니다. 일부 산과 그 주변 산의 모든보다 낮은 경우 마찬가지로, 다음이 산 계곡입니다. 고블린은 공통의 취미를 가지고 - 마시는 술집은 계곡에 설정할 수 있습니다. 고블린 술집은 항상 붐비는 낮이나 밤, 고급 와인의 냄새는 여러 곳의 반경 불어 될 수있다. 고블린은 각 전망대 피크에 설정할 수 있습니다, 또한 매우 경고 생물이며, 처음으로 그 외국 적의 침공을 보장하기 위해 감시 작품으로 변합니다. N 고블린은이 생활을 세밀하게 할 수 있습니다 전체 산맥의 조건을 충족하기 위해, 각 세그먼트는 전망대 또는 술집 중 하나를 구축 할 수 있습니다이 부분의 산을 희망한다. 지금 당신은 길이 N은 얼마나 많은 산에 사는 미세 할 수 있습니다에, 알고 싶어요. 이러한 아이 ≠ 양성하는 난을, 존재 경우만 두 범위 A 및 B는 다르다. 이 숫자가 클 수 있기 때문에, 당신은 단지 그것에 관심이 P.로 나눈 나머지
입력
산출
그것은 단지 한 줄, 당신이 먹는 것보다 P에 대한 답변을 요청 후 결과를 나타내는 양의 정수가 포함되어 있습니다.
샘플 입력
4 7
샘플 출력
3
힌트
101,810 ^ {18} 1 0 1 8 1 <= Q <= 10510 ^ 5 1 0 5
이유는 몇 가지의 조합은?
두 가지 방법 N-되어있다 2 , 필요한 조합의 수는 다른하지 않습니다.
I는 푸시 식 이러한 두 가지 방법을 배제 수를 잘못 계산하기 때문이다. . . 마지막으로 검색
해결 방법 1
제공자 (DP)는 [I] [J]를 [ ST는] 로하면 구성이 I 인 산의 현재 길이를 나타내고, 상대 산 단부 J의 높이와 감소는 각각 주 세인트 0,1에서 끝낸다.
내가 어떻게 재귀 생각할 수 없다? 테이블 아 플레이!
DP [1] [1] [] 또한 특별한 조작을 2 회 반복하고, 고려되지 않는다.
겉으로 만 거꾸로 두 테이블을 발견하고, 캔을했다. 예로서, 일 = 표 1.
(나는 3 일을 찾을 교육 훈련) 법을 찾기 : DP [I] [J] = [시그마 K = 1-> J . DP [-I 1] [IK]
공식의 의미는 무엇입니까? 우리는 난의 길이를 원하는 경우에, 나는 마침내에서 산 매우 최초의 J에 대한 높은 순위.
우리는 그 다음 마지막으로 산을했다하면 끝에서 두 번째 산 마지막보다 높은 높이 때문에 그 순위 1. 그렇지 않으면 변경.
K <J, 필요한 상향 추세 DP [I] [J] [0] + DP = [I-1] [K] [1] 때문에
계정에 반전 문제를 복용하는 식이었다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #INCLUDE <cstdio> 2 INT 개조, N, DP [ 2 ] [ 4222 ], ANS; 3 인라인 INT MODD ( INT P) { 복귀 p> = 개조 P-? MOD : P} -4- INT 의 main () { 5 DP [ 0 ] [ 2 ] = 1 ; 6 는 scanf ( " %의 D % d에 " , N, 개조); 도 7 에 대해 ( int로 I = 3 , I는 = N <; I ++) 대 ( INT의 J = 1 ; J <= I, J ++) DP [I &1 ] [J]의 MODD = (DP [I & 1 ] J = 1 ] + DP [I & 1 ^ 1 ] [I-J + 1 ]); 8 대 ( INT의 J = 1 ; J <= N; ++ j)의 ANS = MODD (ANS + DP [n은 1 ] [J]); 9 의 printf ( " %의 D " , MODD (ANS << 1 )); 10 }
솔루션 2 두 산을 유행, 지금 병합해야하는 경우 고려하십시오.
계정의 모든 상황을 고려,이 산의 경우 점의 다른 수는 조합의 수를 이용하여 계산 하였다.
이것은 달성하고, 배열 계산과 비슷하지만, 나는 몰랐어요, 내가 말을하지 않습니다.
어떤 코드를 볼 수있는 공식이다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #INCLUDE <cstdio> 2 INT의 C [ 2 ] [ 4202 ], DP [ 4202 ] [ 2 ]; 3 INT 의 main () { 4 INT의 n은, p는 지금 = 0 ; 5 는 scanf ( " %의 D % d에 " , 및 N, P); 6 DP는 [ 0 ] [ 0 ] DP가 [= 0 ] [ 1 ] = C는 [ 1 ] [ 0 ] = C는 [ 1 ] [ 1 ] DP = 1 ] [ 0 ] DP [= 1 ] (1)] = 1 ; (7) 에 대한 ( int로 I = 2 ; 나는 = <N; 나는 ++ 지금 ^ = 1 ) { 8 C [현재] [ 0 ] = 1 ; C [현재] [I] = 1 ; 9 대 ( INT의 J = 0 ; J <I, J ++ ) { 10 만약 (j) C [현재] [J] = (C [지금 ^ 1 ] [J] + C [지금 ^ 1 ] J = 1 ] ) %의 P; 11 DP [I] (ij- 1 ) % 2 = (DP [I] (ij- 1 ) % 2 ] + 1ll * DP [J] [ 1* DP [ij- 1 ] (ij- 1 ) % 2 ] % 포인트의 C * [지금 ^ 1 ] [J]의 P %) %의 P; 12 } 13 } 14 의 printf ( " %의 D " (DP [N] [ 0 ] + DP [N] [ 1 ])의 % P); 15 }