形而上学的な質問...
$ 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 ; }