法律を見つけることです、私はそれぞれの子の父親と息子の差が離れて最大のfibonaccからであることを発見しました
それは証明可能です
F [i]は、現在の月のウサギの合計数を表し
F [I] = F [I-1] + F [I-2](F [I-2] F新生児は、である[I-1]古いです)
そして、セットの使い方について学びます
1の#include <iostreamの> 2の#include <cstdioを> 3の#include < ストリング > 4の#include <アルゴリズム> 5の#include <cmath> 6の#include <ベクトル> 7の#include <地図> 8 <の#include 設定 > 9#含む<CStringの> 10 の#define MAXN 1000001 11 の#define INT長い長い 12 使って 名前空間STDを、 13 のint L [MAXN]、R [MAXN]。 14 セット < 整数 > V。 15 INTF [MAXN]。int型メートル。 16 ボイドset_work() 17 { 18 F [ 1 ] = 1 ; [F 2 ] = 2 。 19 v.insert([F 1 ]); v.insert(F [ 2 ])。 20 のために(int型 I = 3 ; iが= < 60 ; ++ i)が 21 { 22 F [I] = F [I- 1 ] + F [I- 2 ]。 23 v.insert(F [I])。 24 } 25 } 26 INT検索(INT X) 27 { 28 セット < 整数 > ::それをイテレータ。 29 は= v.lower_bound(X)を、 30 it-- 。 31 リターン * それ。 32 } 33 INT LCA(int型のx、int型のY) 34 { 35 であれば(x == y)は戻りX。 36 であれば(X> Y)スワップ(X、Y) 37 であれば(X + 1 ==のY)戻り1LL。 38 セット< 整数 > SS。 39 ss.insert(X)。 40 一方(X =!1 ) 41 { 42 X- = 見つける(X) 43 ss.insert(X)。 44 } 45 ながら(!Y = 1 ) 46 { 47 Y- = 見つける(Y) 48 であれば(!ss.count(Y)= 0 ) 49 { 50 リターンY。 51 } 52 } 53 リターン 1 。 54 } 55 )(主符号付き 56 { 57 のscanf(" %のLLD "、&M)を、 58 のためには、(int型 I = 1 ; I <= M; ++ I) 59 { 60 のscanf(" %のLLDの%のLLD "、&L [I]、およびR [I])。 61 } 62 set_work()。 63 のために(int型 I = 1 ; I <= M ++ i)が 64 { 65 のprintf(" %のLLDする\ n "、LCA(L [i]は、R [I]))。 66 } 67 }