白駿2749号:フィボナッチ数3
3871 ワード
質問:https://www.acmicpc.net/problem/2749
1st Thinking)
これはn番目にフィボナッチ数を求める問題である.でも….そのnの範囲は相当する.
nは1兆円以下の自然数である.
まず、その資料型の有無符号long long型を扱うことができる.だから入力はまずusigned long longで解決することができます.
しかし、繰り返し文をnの最低価格に調整すると、、、タイムアウトする可能性がありますが、私はもう試しました.
私はやはり私だと思っていた.
2nd Thinking)
i 2番目のフィボナッチ数があると仮定する.
(i次フィボナッチ数)+(i+1次フィボナッチ数)=(i+2次フィボナッチ数).
ここで私が注目しているのは、問題の中で条件として提出された対応する文です.
出力フィボナッチ数を10万の残数で割った.
計算が100000未満のものなので、一定の周期で繰り返すのは、必ずしもnのその広い範囲を繰り返す必要はありませんが、n個のナットを繰り返す周期によって知ることもできますよね?
したがってnを10003000程度に制御し,nのフィボナッチ数に出力する.それから、同じ値段があるかどうか見たいかもしれませんが...
いいえ、ありません.
それ以外に、私は何も知ることができないようなので、他の人の解答を見てから勉強することにしました.
Answer)
ピサノサイクルを参考にして解決できる問題だそうです.
ピザ黄酒とは何ですか.
In number theory, the nth Pisano period, written as π(n), is the period with which the sequence of Fibonacci numbers taken modulo n repeats. - https://en.wikipedia.org/wiki/Pisano_period
そうだそうです.すなわち,整数論でフィボナッチ数にモード乗算を適用すると,フィボナッチ数は一定の周期で繰り返される.証明よりも、Well-Knownはこのような考えを受け入れるべきだ.
10万に分かれた残りの部分については、ピサノサイクルを15万と呼ぶ.だからピサノサイクルを利用して解答しました.
学習のポイント)
Code)
#include <iostream>
#include <string.h>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <list>
using namespace std;
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int arr[1500010];
unsigned long long n;
cin >> n;
arr[0]=0;
arr[1]=1;
int temp;
for (unsigned long long i = 2; i <=1500000; i++)
{
arr[i] = arr[i-1] + arr[i-2];
arr[i]%=1000000;
}
cout << arr[n%1500000];
}
Reference
この問題について(白駿2749号:フィボナッチ数3), 我々は、より多くの情報をここで見つけました https://velog.io/@ironywon/백준-2749번-피보나치-수-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol