サマースクールキャンプ(第九のフィールド)フィボナッチのA.The電源オフ以上2019頭の牛

問題の意味:指定されたN及びM、F(n)はANS = F(1)^ M + F(2)^ M + ... F計算が必要、n個のアイテムの量フィボナッチ数列であり、(N) ^メートル。n個のアイテムとのm乗前にその量フィボナッチ数列。

解決策:この問題は、2つのソリューションを持っていると思われる:1は、サイクルフェスティバル+ CRTである1は、一般的な用語の式では、実際には、この問題は、直接ACをexBMすることができるかもしれません。ここで私は、溶液循環セクション+ CRTで学ぶhttps://blog.csdn.net/ftx456789/article/details/99684004ブロガーは途方もないまあを書き、私がまとめます。

、サイクルセクションにも、私たちは皆、簡単なフィボナッチ金額欄の金型が素数でサイクリングの祭典であることを知っている、と見つけることも比較的容易にこのサイクルの部分は、ここでは実際にフィボナッチメートルのパワー契約ボリュームシリーズを想定し、しかし、弾性率は迷惑な素数1E9ではありません。私たちは、素因数分解を1E9

1 0 0 0 0 0 0 0 0 0 = 2 9 * 5 9 = 5 1 2 * 1 9 5 3 1 2 5

弾性率は512と1953125の言葉はそれぞれ、循環部している場合は、768及び7812500、我々は答えを解くことができることを意味し、金型内の溶液中に答えが512の1953125迅速な計算を死にます。その後、我々はこれらの二つのソリューションはA1とA2を得ていると考えることができます。その後、我々は以下の合同式を持っているでしょう。

ans≡a1(MOD 512)

ans≡a2(MOD 1953125)

だから、最終的に我々はこのCRT ANSそれを見つけます。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
constの LL L1 = 768 ;  // 循环节1 
constの LL L2 = 7812500 ;  // 循环节2 
のconst  int型 P = 1E9; 
LLのF [L2 + 10 ]、和[L2 + 10 ]。
int型nは、MI; 

LLのM [ 5 ]、[ 5 ]。

LL電力(LLのX、LLのP){ 
    LLのRET = 1 (; P; P >> = 1 ){
        もし(P&1)RET = RET * X%のP。
        X = X * X%のP。
    } 
    戻りRET。
} 

LLのexgcd(LL、LLのB、LL&X、LL&Y){
     場合(Bの== 0){X = 1Y = 0返します}
         { 
            LL TMP = exgcd(B、%のB、Y、X)。
            Y - = X *(A / B)。返すTMPを。
        } 
} 

長い 長い作業(){ 
    LL LCM = M [ 1 ]、Xは[= 1]、T、X、Yは、
     ためint型 I = 2 ;私は= < 2 ; I ++は){ 
        LLのB =([I] -X-%のM [I] + M [I])%のM [I]。
        D LL = exgcd(LCM、M [I]、X、Y);    // 特定のソリューション外方程式を解くtはXT(B / D)* X = 
        IF(D%のB)リターン - 。1 ; 
        T =(B / D)* X%M [I]; 
        X- =(T * + X-LCM);    // 次に、X-(K)= X-(1-K)+(TM)。 
        LCMのLCM * M = [I] / D; 
        
        X- = (X-%+ LCM LCM)%のLCM; 
    } 
    戻りX-を; 
} 

int型のmain() 
{
    CIN>> N >> マイル。
    F [ 0 ] = 0 ; F [ 1 ] = 1 int型 I = 2 [I] =([I-F F;; I <= L2 I ++)は1 ] + F [I- 2 ])%のP。
    以下のためにint型私= 1 ; I <= L2; I ++)は和[I] =(SUM [I- 1 ] +電源(F [i]が、MI))%のPと、
    
    M [ 1 ] = 512M [ 2 ] = 1953125を
    [ 1 ] =((N / L1)*和[L1] +和[n個の%のL1])%のP。
    [ 2 ] =((N / L2)*和[L2] +和[n個の%のL2])%P; 
    coutの <<仕事()<< てendl;
    リターン 0 ; 
}

 

1 0 0 0 0 0 0 0 0 0 = 2 9 * 5 9 = 5 1 2 * 1 9 5 3 1 2 5

おすすめ

転載: www.cnblogs.com/clno1/p/11566026.html
おすすめ