9471번: 피사노 주기
첫째 줄에 테스트 케이스의 개수 P (1 ≤ P ≤ 1000)가 주어진다. 각 테스트 케이스는 N과 M으로 이루어져 있다. N은 테스트 케이스의 번호이고, M은 문제에서 설명한 m이다. (2 ≤ M ≤ 1,000,000)
www.acmicpc.net
피보나치수열을 m으로 나누면 일정한 주기를 띄게 되는데 그 주기의 길이를 찾는 문제이다.
우선 주기마다 규칙이 있을 거라 판단하고 몇 개의 케이스를 돌려보았다.
이 외에도 몇개를 더 살펴봤지만 1, 0 숫자가 나온 뒤에 다시 주기가 나오는 것을 확인할 수 있다.
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int tc, n, m;
cin >> tc;
while (tc--) {
cin >> n >> m;
int m1 = 0, m2 = 1, cnt = 0;
do {
int tmp = m1;
m1 = m2;
m2 = (tmp + m1) % m;
cnt++;
} while (m1 != 0 || m2 != 1 || !cnt);
cout << n << ' ' << cnt << '\n';
}
return 0;
}
위와 같은 코드로 m1 이 0이고 m2가 1인 경우로 다시 돌아오면 그 길이가 주기라고 할 수 있다.
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 11444 피보나치 수 6 (0) | 2020.09.18 |
---|---|
BOJ 2749 피보나치 수 3 (0) | 2020.09.18 |
BOJ 1780 종이의 개수 (0) | 2020.09.18 |
BOJ 1992 쿼드트리 (0) | 2020.09.18 |
BOJ 10830 행렬 제곱 (0) | 2020.09.16 |