문제 보고서에 poj3208 종말 언젠가 솔루션

주제 포털

[제목] 효과

적어도 세 개의 연속 번호 (6)을 포함하는 "이라고 짐승 번호 ", 대량 주문에이 작은 수, 첫 번째 숫자 n을 찾을 수 있습니다.

[분석] 아이디어

 (주 : 다음 굵은 "숫자", "짐승 번호"나타냄)
f를 구비을 [I] [3] i 번째 자리의 구성을 도시 숫자 , 번호 [I] [J] F) 디지트 I로 구성되어, 처음에 J 연속 6을 가지고 있지만 수가 번호. 계산 F 제로 선도의 존재를 허용합니다.
전송 방정식을 얻을, 디지털 쉬운 무엇 i 번째 비트 (MSB)를 고려 :

$의 F [I] [0] = 9 * (F [I-1] [0] + F에 [I-1] [1] + F [I-1] [2]) $의
$의 F [I] [1 = F [I-1] [0] $의
$를 F [i]는 [2] = F [I-1] [1] $의
$의 F [I] [3] = F [I-1] [2] + 10의 F * [I-1] [3] $

이러한 전처리 DP 후, F [i]는 [3] n의 작은 결정하도록 수가 비트. 현재 레코드의 끝이 연속 6 몇 가지를 가지고있는 동안 그런 다음, 왼쪽에서 오른쪽으로 모든 고려 사항으로, "법을 채우기 위해 노력"의 생각을 따르십시오.
소규모에서 대규모까지 전류 수치를 직접 얻을 수있는 몇 충전 방법의 여러 뒤에 F 어레이로부터 전처리에 의해 계산 될 수있다 기입이 하나 열거 할 , n은 응답에 비교.

[] 코드 구현

1 #INCLUDE <cstdio>
 2 #INCLUDE <알고리즘>
 3  #DEFINE의 RG 레지스터
 4  #DEFINE이 줄게 긴 긴
 5  #DEFINE의 이동 (난, A는 B)의 경우는 (RG LL 난 =; 나는 = B를을 <; 내가 ++)
 6  #define한다 (나는 A는, B)에 대한이 (LL RG = 난, 난> = B, 난 -) 위로
 7  하여  스페이스 성병;
(8) LL의 F [ 21 ] [ 4 ];
9  INT T, N, m;
10  공극 준비 () {
 11      (F)는 [ 0 ] [ 0 ] = 1 ;
(12)      이동 (I, 0 ,19 ) {
 13          이동 (j, 0 , 2 ) {
 14              F [내가 + 1 ] [J + 1 ] + = F [I] [J]
15              F [I + 1 ] [ 0 ] + = F [I] [J] * 9 ;
16          }
 17          F [I + 1 ] [ 3 ] + = F [I] [ 3 ] * 10 ;
18      }
 19      ;
20  }
 21  INT 의 main () {
 22      준비 ();
23      는 scanf (" %의 D ' , T)
 24      그동안 (T-- ) {
 25          는 scanf ( " %의 D " , 및 N-)
 (26)가          대해 (m = 3. ; F [m] [ 3. <N-]; m ++) / / 비트의 계산 된 수의 M 
27           (RG INT I = m, K = 0 ; I는, 난 - ) {
 28          // 이 K, 비트를 I를 기입하려고 일단 6. 
29              이동 (J, 0 , 9. ) { // i 번째 비트 번호 J에 열거 채우기 
30                  LL MID = F [I- 1이다. ] [ 3. ];
31                  // I-1 전체 방법은 다수의 요구 사항을 만족를 입력하도록 여러 비트 뒤에 발견 
32                  IF (J == . 6 == || K를 . 3 )
 (33)가                      (L, 최대 (진행 . 3 -K- (J == . 6 ), 0 ), 2 )
 (34)는                          중간 F + = I- . 1 ] [L]
 35                  IF (중간 <N) = N- ; 미드
 36                  // 미드가 N보다 작 으면 번호 n 번째에 설명 된 요구 사항을 충족 보다 I-J 비트 커야 
37                  다른 {
 38 인                      IF (K < 3. ) {
 39                          IF (j == 6. ) K ++ ;
 40                          다른 K =0 ;
41                      }
 42                      의 printf ( " %의 LLD ' , J); 휴식 ;
43                  }
 44              }
 45          }
 46 개          둔다 ( "" );
47      }
 48      반환  0 ;
49 }
코드는 여기 찌를

추천

출처www.cnblogs.com/THWZF/p/10991037.html