성우리뷰

피보나치구하기

두원공대88학번뚜뚜 2021. 1. 2. 02:29

 

#include <iostream>
using namespace std;

long long fib[1500001];

int main(void) {

	fib[0] = 0, fib[1] = 1;
	int ret;
	long long n;
	cin >> n;
	{
		for (int i = 0; i < 1500000; i++) {
			fib[i + 2] = (fib[i + 1] + fib[i]) % 1000000;
		}
	}

	cout << fib[n % 1500000];


	return 0;
}

피보나치 수를 특정 수로 나누면 반드시 주기를 이룬다

주기 길이가 p일때 n번째 피보나치수를 m으로 나눈 나머지는, n%p번째 피보나치를 m으로 나눈 나머지와 같다

예를 들어 m=10^k일때 k>2면 그 주기는 15*10^(k-1)이다

 

이게 prerequisite한 문제.

이거 없음 못푼다