문제의 의미
돌 더미 상단이 똑똑한 사람들이 먼저 테이크는 많은 사람을 데려 갈 수있는 게임을, 전부는 아니지만 완수, 각 사람은 두 번 개인을 초과 할 수 없습니다 몇 돌 이후에 걸립니다. 돌의 수는 수학 식 성형에 의해 주어진다.
분석
피보나치 치 보 이순신 결론 : 그리고 만약 경우에만 우위를 잃고 피보나치 같은 돌의 수.
및 $ 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 ; }