질문은 표면 : https://www.cnblogs.com/Juve/articles/11615883.html
나라 X 육군 :
O (T * N) 직접 욕심 관행을 갖고있는 것 같아요
사실, 로그의 절반 이상이 될 수보다 더와
BA 내림차순으로 모든 우선 순위 (이후에이 프로그램 정렬 순서는 최적 스윕이다)
대답의 그런 반
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <CString을> #INCLUDE <알고리즘> #DEFINE INT 긴 긴 #DEFINE 재 등록 네임 스페이스를 사용하여 표준; CONST의 INT MAXN 1E5 + = 5; 인라인 INT 읽기 () { 재 INT (X) = 0; 숯 재 CH = getchar가 (); 동안 (CH2 <0 || CH> '9') CH = getchar가 (); (CH> = 0 && CH <= '9') {(X) = (X << 3) + (X << 1) + CH-'0 ', CH = getchar가 ()} 동안 복귀 X; } 의 INT t, N, L, R; 구조체 노드 { 를 INT, B; 인라인 친구 불리언 연산자 <(P 노드, 노드 Q) { 복귀 PB-PA> QB-QA; } } C [MAXN]; 인라인 불리언 점검 (재 INT X) { (Re는 I = 1을 인터넷 용; I <= N; I ++) { X- = C [i]를 .A; } 1을 반환; } {) (주 서명 ) (t = 읽고; (t -) 동안 { N = 판독 (); L = 0, R = 0; 경우 (; 나는 <= N; 재 I = 1 값 int I ++) { C [I] .A는 C) (판독 = [I] .B 판독 = (); L + C = [I] .A, R + C = [I] .B; } 정렬 (c + 1, C + N + 1); (L <R) {동안 재 INT 중간 = (L + R) >> 1; (수표 (MID)) R = 미드 경우; 다른 중간 L = + 1; } 의 printf ( "% LLD \ 없음"l); } 0을 반환; }
순열 :
$ C_ {N} ^ {I} * C_ {N} ^ {I} {N} ^ {I} * $ C_ C_ {N} ^ {NI} $로 $,
이 경우, 그 프로그램 번호의 선택된 N (NI)의 i 번째의 프로그램에 의해 선택된 n 개의 사이, 각 I를 들면, 최종 합계는.
이러한 응답은 물품의 2N에 사실상 동등한 얻어진 제 N (NI) 번째 선택한 후, 선택된 NI ,,
i가 0에서 n까지의 모든 정수에 걸쳐 실행되므로 또한, 그 축적 된 프로그램의 수는 $ C_ {2 * N} ^ {N} $ 같다.
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <CString을> #INCLUDE <알고리즘> #DEFINE INT 긴 긴 #DEFINE 재 등록 네임 스페이스를 사용하여 표준; CONST의 INT MAXN = 2e6 + (5); CONST INT 개조 1E9 + = 7; INT의 t, N, FAC [MAXN], INV [MAXN]; 인라인 INT q_pow (재 INT A, 재 INT B를 재 INT의 P) { 재 INT 입술 = 1; (b) {동안 경우 (B & 1) = 입술의 입술 *는 %의 P; A = A * %의 P; B >> 1 =; } 고해상도를 반환; } 인라인 공극 get_c (재 INT의 N) { FAC [0] = FAC [1] =의 INV [0] = 1; 경우 (; 나는 <= N을, 재 I = 2 int로 I ++) { FAC [I] = FAC [I-1] * % 나 개조; } INV [N] = q_pow (FAC [N], 2 개조 개조); 위한 (재 값 int I = N-1, I> = 1 - I) { INV [I]의 INV = [I + 1] * (I + 1) 개조 %; } } 인라인 INT C (재 INT N, 재 INT의 m) { 경우 (m> n)의 복귀 0; (m의 == 않음)에 1을 반환하는 경우; FAC [N] * % 개조 INV [m] * % 개조 INV [나노] %의 개조를 리턴; } 주 () {서명 get_c (2e6를); scanf와 ( "%의 LLD", t); {- (t) 동안 , scanf와 ( "%의 LLD", N) 의 printf ( "% LLD \ 없음", C (2 * N, N)); } 0을 반환; }
회문 :
G [I] [J]의 정의에 회문 J 행 I이 섹션이 형성 될 수 있는지 g의 [내가 + 1] [J-1] 전송을 나타낸다 :
경우 (; 나는 <= LEN, I = 1 값 int I ++) { g [I] [I] = 1; F [i]는 [I] = 1; 대 (INT의 J = 1; J <= 분 (I-1, 렌-1); ++ j)는 { 경우 (S [IJ] == S [i가 + J])는 { g는 [IJ] 난과 j ] = 1; } 다른 휴식; } } 에 대해 INT (I = 1; I <= 렌-1; I ++) { 경우 (S [I] == S [i가 + 1]) { g [I] [I + 1] = 1; F [i]는 [I + 1] = 3; 대 (INT의 J = 1; J <= 분 (I-1 렌-I-1); ++ j)는 { 경우 (S [IJ] == S [I + 1 + J]) { g [IJ] [I은 + 1 + j를] = 1; } 다른 휴식; } } }
F [I] [J]의 정의 J 답변에 I를 나타내고,이
有 转移 : $ F의 [리터] [R] = F [L + 1] [R] + F [1] [R-1] -f [L + 1] [R-1] + g [1] [R ] $
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <CString을> #INCLUDE <알고리즘> #DEFINE INT 긴 긴 #DEFINE 재 등록 네임 스페이스를 사용하여 표준; CONST의 INT의 MAXN = 5005; 문자 S [MAXN]; INT의 t 렌 [MAXN] MAXN] F; 부울 g [MAXN] MAXN]; 서명의 main () { 는 scanf ( "%의 S ', S + 1); LEN 나 strlen = (S + 1); 경우 (; 나는 <= LEN, I = 1 값 int I ++) { g [I] [I] = 1; F [i]는 [I] = 1; 대 (INT의 J = 1; J <= 분 (I-1, 렌-1); ++ j)는 { 경우 (S [IJ] == S [i가 + J])는 { g는 [IJ] 난과 j ] = 1; } 다른 휴식; } } 에 대해 INT (I = 1; I <= 렌-1; I ++) { 경우 (S [I] == S [i가 + 1]) { g [I] [I + 1] = 1; F [i]는 [I + 1] = 3; 대 (INT의 J = 1; J <= 분 (I-1 렌-I-1); ++ j)는 { 경우 (S [IJ] == S [I + 1 + J]) { g [IJ] [I은 + 1 + j를] = 1; } 다른 휴식; } } } 에 대해 (; 나는 = LEN <; I = 2 값 int ++ I) { 대 (INT의 L = 1, L <= 렌-I + 1; ++ ℓ) { INT의 R = L + I-1; F [1] [R] = F [L + 1] [R] + F [1] [R-1] -f [L + 1] [R-1] + g [1] [R]; } } 는 scanf ( "%의 LLD", t); 동안 (t -) { 재 INT의 L, R; scanf와 ( "%의 LLD의 %의 LLD ', L, R); 의 printf ( "% LLD \ 없음 ', F [1] [R]); } 0을 반환; }