여름 학교 캠프 (다섯 번째) 발전기 1 오프 이상 2019 소

시간 제한 : C / C ++ 이초 4 개 초 언어를 다른
공간의 제한 : C / C ++ 262144K, 다른 언어 524288K의
64 비트 IO 형식 : LLD의 %

제목 설명

네 개의 양의 정수 X0, X1, A, B에 주어진 X 0 , X 1 , , B . 그리고 당신이 알고있는  모든 i≥2을 위해.

그리고 MOD N 개의 양의 정수를 감안할 때, xnx_n의 계산하시기 바랍니다 X n 개의 모듈로 MOD를.

문제는 단순한 보입니까? 놀람! n 값은 많은 자리수를 가질 수있다!

설명을 입력합니다 :

입력은 두 개의 라인을 포함한다. 
첫 번째 라인은 네 개의 정수 X0, X1, A, B를 포함 (1≤x0, X1, A, b≤10 ^ 9).
둘째 줄은 MOD N 개의 정수를 포함 (^ 6 1≤n <10 (10) 10 ^ 9 <MOD≤2 ^는 9 × 10, N에는 앞에 0이 없다).

출력 설명 :

답을 나타내는 하나 개의 정수를 인쇄합니다.

기입

1 1 1 1 10 1,000,000,001

수출

89

설명

얻어진 시퀀스 X는 피보나치 시퀀스이다. 11 번째의 상품 (89)이다.

기입

1,315 521 20,185 5,452,831 1,000,000,007 9999999999999999999999999999999999999

수출

914730061

: 문제점의 의미 알려진 X0, X1, A, B, N, 개조, 및 수식 , 요구 모듈로 개조 대.

해결 방법 : 진수 빠른 전원.            

 

코드 :

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
 X0, X1, A, B, 개조;
구조체 노드 
{ 
    Martix [ 2 ] [ 2 ]; 
  노드 운영자 * ( CONST 노드 N) CONST 
  { 
   노드 합; 
   int로 I, J, K;
    (I = 0 ; I는 < 2 ; i가 ++ )
      에 대한 (j = 0 ; j를 < 2 , J ++ ) 
     { 
       sum.Martix [I] [J] = 0 ;
        (K = 0 ; K < 2 k 번째 ++ ) 
         sum.Martix [I] [J] = (sum.Martix [I] [J] + Martix [I] [K] * n.Martix [K] [J] ) %의 모드; 
     } 
    리턴 합; 
  } 
}; 
노드 ANS, t; 
 N [ 1000005 ]; 
빠른 노드 (노드 A, INT의 K);
INT 의 main () 
{ 
  int로 난, K, L; 
  scanf와 ( " % LLD % LLD % LLD % LLD " , X0, X1, A, 및 B); 
  scanf와 ( " % S %의 LLD " , N, 개조); 
  ans.Martix [ 0 ] [ 0= ans.Martix는 [ 1 ] [ 1 ] = 1 ; 
  ans.Martix [ 1 ] [ 0 ] = ans.Martix는 [ 0 ] [ 1 ] = 0 ; 
  t.Martix는 [ 0 ] [ 0 t.Martix은 [] A가 = 0 ] [ 1 ] = B; 
  t.Martix는 [ 1 ] [ 0 ] = 1 ; t.Martix [ 1 ] [ 1 ] = 0 ;  = 용 의 strlen (N);
   (I = 1- (1) , I> = 0 ; 난 ... ) 
  { 
    ANSANS = * 빠른 (t, N [I] - ' 0 ' ); 
    t = 빠른 (t, 10 ); 
  } 
  의 printf ( " %의 LLD " (X1에서의 ans.Martix * [ 1 ] [ 0 ] + X0 * ans.Martix [ 1 ] [ 1 ]) %의 개조)를; 
  시스템 ( " 정지 " );
  반환  0 ; 
} 
노드 빠른 (노드 A,
INT의 K) { 노드 합; sum.Martix [ 0 ] [ 0 ] = sum.Martix는 [ 1 ] [ 1 ] = 1 ; sum.Martix [ 0 ] [ 1 ] = sum.Martix [ 1 ] [ 0 ] = 0 ; 하면서 (K) { 경우 (K & 1 ) 합계 = 합계 * a 및 K >> = 1 ; = A * a 및 } 리턴 합; }

추천

출처www.cnblogs.com/VividBinGo/p/11291591.html