이야기의 hdu4507 Jige 시리즈 - 7 아내를 미워하지 [디지털 DP]

이 질문은 어떤 쓰레기 물건을 직면


 

첫 번째 질문의 형식은 디지털 DP를 볼 것으로 예상하지만, 제곱의 합을 찾고 있습니다. DP의 디지털 출시를보십시오.

먼저 시도하고 철자. 제공자 $의 F [LEN은 [합] [개조] $는 $ 렌 $ 비트 포지션 디지트 기입 $ SUM $가 충전되어, 수치 $ 개조 번호 반응식 $ 시간의 나머지 부분을 나타내고, $의 g [LEN] [합] [MOD] $ (충전이없는 공간의 후방 부 및 프론트 남은 횟수 참조) 모든 요구 및 개수를 만족시키기 위해,이 경우이다.

수의 후 작성 열거 한 후 $ 내가 $ I $이 충전되고, 각각 $의 X의 $에 대한 요구 사항을 충족, $

$ 10 ^ {- 1} 렌 I + X $

($ f를 아래 [렌-1] [SUM (+ I) \ 개조 7] (MOD * 10 + I) \ 개조 7 $ 약칭 $의 F '$, $의 g, 시간 $ 공감)

따라서, 누적 효과가 각각 $ I $ 들면 $ X 이러한 달러하고 있어야 푸시

$ g의 [LEN] [합] [개조] = \ 합계 \ limits_ {I} (10 ^ {렌 - 1}이 '+ g') $

그래서는 $ g의 $의 순환을 완료했다. $ H $ 광장과 유사하게 추정 뒤 공석의 수를 나타냅니다.

$의 H [LEN] [합] [개조] = \ 합계 \ limits_ {I} (10 ^ {렌-1}) ^ 2 I ^ 2 F '+ \ 합계 \ limits_ {I} 2 * 10 ^ {len- 1}의 경우 '+ g'$

그런 다음 $이었다 재발 후마다 나는 완료 DFS를 $.

$의 F, G,에 약간의 트릭이 실현합니다 시간 $ 모든 구조를 넣어, 너무 얻기 위해 하나 직접 액세스 한 후 완료 DP 그의 전체 패키지 $의 F, G는 시간 $, 무슨 카드의 상한 고려하지 않았을 또는 추가 아무것도 기록 귀찮게.

WA1 : LONGLONG 입력 잊어 버렸습니다. .

WA2 : 모듈로 좋은 기록. . 모듈을 감소에 연연하지 마십시오, 또는 정말해야 범위를 방지하기 위해 엄격 연산의 수를 모듈로하려면, 고려 누출됩니다.

1 #INCLUDE <iostream>
 2 #INCLUDE <cstdio>
 3 #INCLUDE <CString을>
 4 #INCLUDE <알고리즘>
 5 #INCLUDE <cmath>
 6  #DEFINE DBG (X) cerr << #x를 << "="X << << ENDL
 7은  사용  공간의 성병;
8 타입 정의  LL;
9 타입 정의 를 두 번 DB;
10 의 typedef 쌍 < INT , INT > PII;
(11) 서식 <유형 이름 T> T _min 인라인 (TA, TB) { 반환 은 <B를? A : B}
 12템플릿은 <유형 이름 T> T _max 인라인 (TA, TB)를 { 반환 A> B를? A : B}
 13 서식 <유형 이름 T> 인라인 CHAR MIN (T & A, TB) { 복귀 A> B (A = B? 1 ) : 0 }
 14 서식 <유형 이름 T> 인라인 CHAR MAX (T & A, TB) { 반환 은 <B를 (A = B? 1 ) : 0 }
 15 서식 <유형 이름 T> 인라인 공극 _swap (T & A, T 및 B) {A ^ = B ^ = A ^ = B}
 16 서식 <유형 이름 T> 인라인 판독 T (T & X) {
 17      , X = 0 ; INT의 F = 0 ; C; 반면 (isdigit에 (c = getchar가 ())!) 경우 (c == ' - ' ) F = 1 ;
18 일      동안 (isdigit에 (c)) X = X * 10 + (c & 15 ), C = getchar가 (); 반환 F를 X = - X : X;
19  }
 20  CONST의  INT의 P + 1E9 = 7 ;
21  INT의 빈 [ 20 ], BIN2 [ 20 ];
22  구조체 thxorz {
 23      INT의 F, G, H;
24      thxorz ( INT의 F = - 1 ,INT g = 0 , INT H = 0 ) (F) (F), g (g), H (높이)} {
 25 (F)} [ 20 ] [ 7 ] [ 7 ];
26  의 INT B [ 20 ];
27  INT T;
28 LL의 L, R; // 실수 
29 thxorz DP ( INTINTINT 개조, INT의 제한) {
 30 일      경우 (LEN!) 복귀 thxorz (합계 && 개조, 0 , 0 );
(31)      의 경우(제한 && ~ F [LEN] [합] [개조] .F!) 복귀 F [LEN] [합] [개조];
32      의 INT NUM = 제한 B [LEN] : 9 ;
33      thxorz의 RET, TMP; ret.f = 0 ;
34       (등록 INT I = 0 ; I <= NUM; I ++) 경우 (I ^ 7 ) {
 35          TMP = DP (len- 1 , SUM (+ I) % 7 (개조 * 10 + I) % 7 ) && I == NUM 제한; // mistake2 
36          ret.f + = tmp.f; ret.f> = P && (ret.f- = P);
37          ret.g = (+ tmp.g 빈 [len- 1* * 1ll tmp.f의 %의 P *이 난 ret.g) % 이상 P;
38          ret.h = (BIN2 [len- 1 ] * 1ll * tmp.f % 포인트 * 난 + tmp.h + * 2 * 빈 [len- 1 ] * 1ll * tmp.g의 % 포인트 * 내가 ret.h을 + ) %의 P;
39      }
 40      리턴 ? 제한 복귀 : [LEN] [합] [개조] = f를 RET;
41  }
 42 인라인 INT 해결 (LL의 X) {
 43      INT의 LEN = 0 ; 반면 (x)를, B [++ LEN] = % X 10 X / = 10 ;
44      리턴 DP (LEN, 0 , 0 , 1 ) .H;
45  }
46  
(47)  INT 의 main () { // freopen을 ( "test.in", "R", 표준 입력); // freopen을 ( "test.ans", "w", 표준 출력); 
48       (등록 INT I = 0 , 입술 = 1 ; i가 <= 18 ; ++ I, 입술 = 입술 * 1ll * 10 빈 [I] = 입술, BIN2에 [I] = 입술 * 1ll * 입술 % % P) 피;
(49)      판독 (T); 동안 (T -) 판독 (L), (R)의 printf (읽기 " % D \ 없음 " (해결 (R) -solve 1- ( 1 ) + P) %의 P);
50      반환  0 ;
51 }
코드보기

추천

출처www.cnblogs.com/saigyouji-yuyuko/p/11531621.html