FZU2018 수준 알고리즘 첫번째 작업 1.1fibonacci (매트릭스 빠른 전원)

이름

  피보나치 시퀀스를 학습에 와인 최근 지식. 우리는 열의 수를 순환 식 F (N) = F (n은 피보나치의 알고 -1) + F (N-2) (N> = 2 , n은 정수). 이 재귀 F. (N)에 = 때 우리가 알고 싶은 와인은 F.. (1-N) B + F. (N-2) (N> = 2, n은 정수), 우리는 무엇을 얻을 열 수. 그러나 와인은 게으른, 그래서 오직 당신까지 그에게이 작업이 완료 얻을 수 있도록 도와줍니다. 참고 여기에 우리는 여전히 F를 만드는 것이 (0) = F (1 ) = 1.

★ 데이터 입력

  첫 번째 행의 세 개의 양의 정수의 입력 N, A, 및 B (N <= 10; 1 <= A, B <= 100의 정수이다). 이어서 N 열의 각 행 자연수 N (N <= 100000000)가있다.

★ 데이터 출력

  결과는 클 수있다으로하는 광고 출력 정수 F (n)은, 감는 모듈 2013의 출력이 필요했다.

입력 예 출력 예

5 4 5

4

8

(16)

(32)

9

(209)

1,377

(182)

9

 

해결 방법 :

  고전적인 매트릭스는 급속한 전력 문제를 베어.

  우리는 $ A ^ {B} 시간 개조 계수 달러를 요청할 때 먼저, 고속의 성능을 설명하기 위해, B는 이진, B로 변환 될 수는 합계의 보조 전원들로 변환 될 수있다. 우리는 (2)의 12 번째의 전력을 계산 예를 들어, (12)은 각각 두 개의 4 1, 8, 1100, (1100)의 이진 비트 무게이므로, $ 2 ^ {12} $ 배 용이 $ 2로 전환시킬 수있다 ^ {4} * $ 2 ^ {8}. 따라서, 우리는 첫 번째 응답 ANS 1,2,4,8 ..... 1 명 전원 만 계산에 할당하고 있으면 1, 1이 될 수있다, 비트 (B)의 값을보고 상기 ANS 캔 곱한.

빠른 전원 코드를 다음과 같이

LL의 fastpow (LL의 B, A LL) 
{ 
    LL ANS = 1 ;
    반면 (b) 
    { 
        경우 (B & 1 ) = ANS ANS *는 %의 모드; = A *는 %의 모드; 
        B >> = 1 ; 
    } 
    반환 ANS; 
}

  다음으로, 더 큰 있기 때문에이 문제에 수 n, 모듈로 플러스 느린,이 질문에 재귀 재귀 타임 아웃을 반환합니다. 우리는 알고리즘의 복잡도는 O (n)은보다 작은 찾아야합니다.

  우리는 매트릭스의 $ \의하기 Binom {F (N)를 구성 할 수있다} {F (N-1)} $ 얻을 수있다

$$
\ 좌회전 (
\ 시작 {} 행렬
A, B \\
1 0
\ {단부 매트릭스}
\ 오른쪽) \ 태그 {2} ^ {N-1} *
\하기 Binom F {(1)} {F (0 )} = \하기 Binom {F (N)} {F (N-1)}
$$

따라서, 우리는 행렬을 계산해야

$$
\ 좌회전 (
\ {} 시작 행렬
A, B \\
1 0
\ {단부 매트릭스}
\ 오른쪽)
$$

제 n-1 번째의 전력은,이 행렬은 n-1 번째의 전력, 고속 시크 매트릭스를 이용하여 얻어진 전력을 위해, 우리는 $ \ 로그 N $으로 시간 F (N)의 값을 계산할 수있다.

사용법 #include <iostream> 
#INCLUDE
<cstdio> #INCLUDE <알고리즘> #INCLUDE <cmath> #INCLUDE <cstdlib> #INCLUDE <CString을> #INCLUDE < 문자열 > #INCLUDE <벡터> #INCLUDE <큐> #INCLUDE < 설정 > 사용하는 네임 스페이스 표준을; 타입 정의 LL; 타입 정의 더블 LD; 타입 정의 부호없는 날개 펼진; 쌍 타입 정의 < INT ,PII; #DEFINE의 담당자 (I, X, Y)를 위해 (ⅰ =의 X를 나타내는 int i가 예를 <; I ++) #DEFINE REPT (I, X, Y)에 대해 (ⅰ =의 X를 나타내는 int 난 = Y를 <; 내가 ++) #DEFINE 당을 (I, X, Y)를 위해 (ⅰ =의 X를 나타내는 int I> = Y, 난 -) #DEFINE PB와 push_back #DEFINE 인터넷 제 #DEFINE SE 제 #DEFINE의 MES (a, b)가 memset (a, b를,는 sizeof a) CONST INT INF = 0x3f3f3f3f ; CONST INT 개조 = 2,013 ; 클래스 매트릭스 { 공개 : INT의 arrcy [ 6 ] [ 6 ]; // arrcy为矩阵,下表从0开始 INT행, 열, 행 //为矩阵的行열为矩阵的列 친구 행렬 연산자 * (S1 행렬, 행렬 S2) { int로 , I, J를하는 단계; 매트릭스 (S3); (I = 0 ; I는 <s1.row 난 ++ ) { 대한 (j = 0 ; j를 <s2.column, J ++ ) { 위해 ( INT에서 K = 0 ; K <s1.column k 번째 ++ ) { s3.arrcy [ I] [J] + = s1.arrcy [I] [K] * s2.arrcy [K] [J]; s3.arrcy [I] [J] (%) = { 개조; } } } S3.row = s1.row; s3.column = s2.column; 반환 S3 단계; } } 매트릭스 quick_pow (매트릭스 S1, N-) // 고속 전력 함수 행렬, S1 행렬은, N의 힘 { 매트릭스 MUL = S1은 ANS;
// ANS 매트릭스로서 구성 될 ans.row
= ans.column = ; s1.row memset 함수 (ans.arrcy, 0 , sizeof의 용 ; ans.arrcy) 에 대해 ( int로 된 I = 0 ; I은 <ans.row 내가 ++ ) ans.arrcy [I] [I] = 1 ; 동안 (N) { 경우 (n은 1 ) = ANS ANS * MUL; MUL = MUL * MUL; N / = 2 ; } 반환 ANS; } INT 주 () { IOS :: sync_with_stdio ( 거짓 ); cin.tie ( 0 ); INT의 N, A, B; CIN >> N 사항 >> >> B; 매트릭스 MUL; mul.row = mul.column = 2 ; mul.arrcy [ 0 ]0 ] = a 및 mul.arrcy는 [ 0 ] [ 1 ] = B 단계; mul.arrcy [ 1 ] [ 0 ] = 1 ; mul.arrcy [ 1 ] [ 1 ] = 0 ; 행렬 R; r.row = 2 ; r.column = 1 ; r.arrcy [ 0 ] [ 0 ] = r.arrcy는 [ 1 ] [ 0 ] = 1 ; 렙 (I, 0 , N) { INT (X); CIN >> X; 만약 (! X = 1, <1 X 때 // X) 0 고속 전력을 사용할 수 있으며, 응답은 0, 판정 CAN 공보 { COUT << . 1 << ENDL는, 계속 ; } 매트릭스 mm = quick_pow을 (MUL , X- . 1 ), mm = mm * & lt; 화학식 COUT << mm.arrcy [ 0 ] [ 0 ] << ENDL; } 리턴 0 ; }

 

추천

출처www.cnblogs.com/FZUzyz/p/11490946.html