[제목] 효과
적어도 세 개의 연속 번호 (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 }