2019ICPC 쉬 저우 네트워크 게임 A.Who 낫다? - 치 보 이순신 && 피보나치 확장, 중국 잉여 정리

문제의 의미

돌 더미 상단이 똑똑한 사람들이 먼저 테이크는 많은 사람을 데려 갈 수있는 게임을, 전부는 아니지만 완수, 각 사람은 두 번 개인을 초과 할 수 없습니다 몇 돌 이후에 걸립니다. 돌의 수는 수학 식 성형에 의해 주어진다.

주제 링크

분석

피보나치 치 보 이순신 결론 : 그리고 만약 경우에만 우위를 잃고 피보나치 같은 돌의 수.

및 $ N 개의 \의 당량은 10 ^ {15} $는 피보나치이 범위 내에서 반송 (72)의 수는, 그것은 전처리 될 수 있음 만하기 때문이다.

참고 오래 오래 버스트 것!

사용법 #include <iostream> 
#INCLUDE <cstdio>
 #DEFINE LL __int128
 사용  스페이스 성병; 

CONST LL MAXN가 = 15 ; 
LL의 FIBO [ 80 ] = { 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , 610 , 987 , 1,597 , 2,584 , 4,181 , 6,765, 10,946 , 17,711 , 28,657 , 46,368 , 75,025 , 121,393 , 196,418 , 317,811 , 514,229 , 832,040 , 1,346,269 , 2,178,309 , 3,524,578 , 5,702,887 , 9,227,465 , 14930352 , 24157817 , 39088169 , 63245986 , 102,334,155 , 165,580,141 , 267,914,296 , 433,494,437 , 701,408,733 , 1,134,903,170는, 1836311903 , 2971215073 , 4807526976 , 7778742049 , 12586269025 , 20365011074 , 32951280099 , 53316291173 , 86267571272 , 139,583,862,445 , 225,851,433,717 , 365,435,296,162 , 591,286,729,879 , 956,722,026,041 , 1,548,008,755,920 , 2,504,730,781,961 , 4,052,739,537,881 , 6,557,470,319,842 , 10,610,209,857,723 , 17,167,680,177,565 , 27,777,890,035,288 , 44,945,570,212,853은, 72,723,460,248,141 , 117,669,030,460,994 , 190,392,490,709,135 , 308,061,521,170,129 , 498,454,011,879,264 , 806,515,533,049,393 }; 

INT K; 
LL C [MAXN], M [MAXN, X, Y; 
LL의 GCD (LL A, LL의 b) { 
    복귀 ㄴ == 0 ? A : GCD (B, A의 % B); 
} 
LL의 exgcd을 (LL A, B를 LL, LL 및 X, LL 및 Y) {
     경우 (b의 == 0 ) {X = 1 , Y가 = 0 ; 반환 } 
    LL R = exgcd (B, A %의 B, X, Y)를 TMP; 
    TMP= X; X = Y; Y는 = TMP를 - (a / b) * Y;
    반환 R을; 
} 
LL의 반전 (LL A, LL의 b) { 
    LL R = exgcd (A, B, X, Y);
    반면 (X < 0 ) = X + B;
    반환 X를; 
} 
INT 의 main () { 
    는 scanf ( " %의 D ' , K);
    위한 ( int로 I = 1 ; K = 난을 <; 내가 ++)   // X = C [i]는 (MOD M [I]) 
    {
          _M, _c; 
        scanf와 ( " %의 LLD의 %의 LLD " , _M, _c);
        M [I] = _M, C [I] = _c; 
    } 
    부울 플래그 = 1 ;
    대해 (LL I = 2 ; 나는 = K를 <; 내가 ++ ) { 
        LL M1 = M [I - 1 , M2 = M [I], C2 = C [i]를, C1 = C [I - 1 ] T = GCD (M1, M2);
        만약 (! (C2 - C1)의 % T = 0 ) {플래그 = 0 ; 침입 } 
        M [I] = (M1 * M2) / T;  // 可能爆긴 긴 
        C [I] = (INV (M1 / T, M2 / T) * (C2 - C1) / T) % (M2 / T) * M1 + C1; 
        C [I]는 = (C [I] % M [I] M + [I]) %미]; 
    } 
    // 의 printf ( "% LLD \ 없음"플래그 C [K] : -1); 
    경우 (플래그 == 0 )의 printf ( " Tankernb \ n! " );
    다른 
    { 
        부울 FLG = 거짓 ;
        위한 ( int로 I = 0 ; I는 < 80 ; I ++ )
             경우 (FIBO [I] == C [K]) 
            { 
                FLG = ;
                휴식 ; 
            } 
        경우 (FLG)의 printf ( " Lbnb! \ n ");
        다른 사람 의 printf ( " Zgxnb \ n! " ); 
    } 

    반환  0 ; 
}

 

추천

출처www.cnblogs.com/lfri/p/11482466.html