고블린 종족 : DP

기술

전설은 오래 전,이 땅에서 신비한 생물들이 살고 : 고블린. 고블린은 끝없는 산에서 살고 싶어. 좌우가 섹션으로 분할 될 수로부터 하이 1 및 N. 사이의 양의 정수이고 구체적으로는, 산 길이 N H N은 각각 하이 고유 높이가 산의 조각은 주변 산의 모든보다 높은 경우, 다음이 산 피크입니다. 산 일부 인근 산의 가장자리에 위치하고 있으며, 다른 두 (즉, 왼쪽 및 오른쪽)이 있습니다. 일부 산과 그 주변 산의 모든보다 낮은 경우 마찬가지로, 다음이 산 계곡입니다. 고블린은 공통의 취미를 가지고 - 마시는 술집은 계곡에 설정할 수 있습니다. 고블린 술집은 항상 붐비는 낮이나 밤, 고급 와인의 냄새는 여러 곳의 반경 불어 될 수있다. 고블린은 각 전망대 피크에 설정할 수 있습니다, 또한 매우 경고 생물이며, 처음으로 그 외국 적의 침공을 보장하기 위해 감시 작품으로 변합니다. N 고블린은이 생활을 세밀하게 할 수 있습니다 전체 산맥의 조건을 충족하기 위해, 각 세그먼트는 전망대 또는 술집 중 하나를 구축 할 수 있습니다이 부분의 산을 희망한다. 지금 당신은 길이 N은 얼마나 많은 산에 사는 미세 할 수 있습니다에, 알고 싶어요. 이러한 아이 ≠ 양성하는 난을, 존재 경우만 두 범위 A 및 B는 다르다. 이 숫자가 클 수 있기 때문에, 당신은 단지 그것에 관심이 P.로 나눈 나머지

입력

그것은 하나 개의 라인을 포함, 두 개의 양의 정수 N, P.

산출

그것은 단지 한 줄, 당신이 먹는 것보다 P에 대한 답변을 요청 후 결과를 나타내는 양의 정수가 포함되어 있습니다.

샘플 입력

4 7

샘플 출력

3

힌트

 

영상
20 데이터 만족 %의 N ≤ (10),
상기 데이터의 40 % N≤18을 충족하는
데이터의 70 %, N≤550 맞게;
3≤N≤4200, P ≦ 충족하도록 데이터의 100 % 10910을 ^ 9 1 0 9

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] 때문에

계정에 반전 문제를 복용하는 식이었다.

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 }
317 바이트

솔루션 2 두 산을 유행, 지금 병합해야하는 경우 고려하십시오.

계정의 모든 상황을 고려,이 산의 경우 점의 다른 수는 조합의 수를 이용하여 계산 하였다.

이것은 달성하고, 배열 계산과 비슷하지만, 나는 몰랐어요, 내가 말을하지 않습니다.

어떤 코드를 볼 수있는 공식이다.

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 }
소 mikufun에서

추천

출처www.cnblogs.com/hzoi-DeepinC/p/11131712.html