237 words
1 minutes
[BOJ] 피보나치 수의 제곱의 합
TimeLimit | MemoryLimit | Condition | TAG |
---|---|---|---|
1s | 128MB | (1 ≤ N ≤ 1,000,000,000,000,000,000) | 도가뉴 항등식, Math |
간단한 문제 증명은 여기에서 확인하시면 됩니다.
도가뉴 항등식을 활용해서 큰 피보나치 구하면 되구요. 이제 제곱의 합을 어떻게 구할까?를 생각해보면 됩니다.
제 의식은 흐름은 아래와 같습니다:
정답 코드
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <sstream>
#include <iomanip>
#include <string>
#include <numeric>
#include <unordered_set>
#include <unordered_map>
#include <climits>
using namespace std;
using ll = long long;
ll MOD = 1'000'000'007;
map<ll, ll> dp;
ll solution(ll n){
if(dp.find(n) != dp.end()) return dp[n];
ll result;
ll a, b;
a = solution(n/2);
b = solution(n/2+1+(-2 *!(n%2)));
if(n%2) result = ((a * a)%MOD + (b * b)%MOD)%MOD;
else result = ((((2*b)%MOD + a)%MOD)*a)%MOD;
dp[n] = result;
return result;
}
int main() {
ll n;
cin >> n;
dp[0] = 0;
dp[1] = 1;
dp[2] = 1;
dp[3] = 2;
ll a = solution(n);
ll b = solution(n+1);
// 이게 F_n*F_(n+1)이여서
cout << ((a * b) % MOD);
return 0;
}
[BOJ] 피보나치 수의 제곱의 합
https://compy07.github.io/Blog/posts/boj/11440/