4666 bzoj

形而上学的な質問...

$ F_ {I}が\ $ $ 10 ^ {Y} $ $ $ MODを当場合、まず、次いで$ F_ {I}が存在しなければならない\ $ $ 10 ^ {Y-1} $ $ $ MODを当

したがって、我々は$ F_ {I}を満たす見つけることができる\試験に上方次いで$ $ MOD $ $ 10 ^ {Y-1} $アイテムを当量、および

しかし、この用語は無限ああです

フィボナッチ数は、下部モールド部循環意味で記載されている、および$ 10 ^ {Y} $ループセグメントの長さは$ 10 ^ {Y-1} $サイクル長区間の整数倍でなければなりません

私たちは、ラウンドロビン区間長はうまく列挙します

コード:

書式#include <cstdioを> 
する#include <cmath> 
の#include <CStringの> 
の#include <cstdlib> 
書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <スタック>
 に#define LL長い長い 
 使って 名前空間はstd; 
LLモード、LEN。
pow_add LL(LLのX、LLのY)
{ 
    LL RET = 0 一方、(Y)
    { 
        場合(Y&1)RET =(RET + X)%のモード。
        X =(X + X)%のモード、Y >> = 1 
    RET; 
} 
構造体MAT 
{ 
    LL [ 2 ] [ 2 ]。
    
    友人マット演算子 * (MATのX、MATのY)
    { 
        MATのRET。
        memset(RET.A、0はsizeof (RET.A))。
        以下のためにint型 i = 0 ; iは= < 1 I ++;)のためのINT J = 0 ; J <= 1 ; J ++)のためのINT K = 0 ; K <= 1 ; ++ K)RET.Aを[I] [Jを] =(RET.A [I] [J] + pow_add(XA [I] [K]、YA [K] [J]))%モード;
        リターンRET; 
    } 
    MATのpow_mul(MATのX、LLのY)
    { 
        MATのRET。
        RET.A [ 0 ] [ 0 ] = RET.A [ 1 ] [ 1 ] = 1 
        RET.A [ 1 ] [ 0 ] = RET.A [ 0 ] [ 1 ] = 0 一方、(Y)
        { 
            場合(Y&1)RET = RET * X。
            X = X * X、Y >> = 1 
        } 
        戻りRET。
    } 
} F、G、ORI、T。 
LLのQ;
ベクトル <LL> ANS、tempans。
INT メイン()
{ 
    freopenは(" words.in "" R " 、STDIN)。
    freopenは(" words.out "" W " 、STDOUT)。
    scanf関数(" %のLLD "、&Q)。
    モード = LEN = 1 
    ans.push_back(0 )。
    ori.a [ 0 ] [ 0 ] = ori.a [ 1 ] [ 0 ] = ori.a [ 0 ] [1 templen)。] = 1 以下のためにint型 i = 1 ; iは= < 13 I ++; 
    { 
        モード * = 10 
        F = f.pow_mul(ORI、0)、G = g.pow_mul(ORI、LEN)。
        LL templen = 0 実行{
             ためINT J = 0 ; J <ans.size(); J ++ 
            { 
                場合(t.pow_mul(ORI、ANS [J] + templen).A 0 ] [ 1 ] == q個%モード)tempans .push_back(ANS [J] +
            } 
            F = Fの* gを、templen + = LEN。
        } 一方(FA [ 0 ] [ 0 ] =!1 || FA [ 1 ] [ 0 ] =!0 || FA [ 0 ] [ 1 ] =!0 | FA [ 1 ] [ 1 ] =!1 )。
        ANS = tempans、tempans.clear()、LEN = templen。
    } 
    であれば(ans.empty())のprintf(" -1の\ n " );
    のprintf(" %LLDの\ nを"、ANS [ 0 ])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/zhangleo/p/11059639.html