※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 9471번 문제인 피사노 주기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/9471 

 

9471번: 피사노 주기

첫째 줄에 테스트 케이스의 개수 P가 주어진다. 각 테스트 케이스는 N과 M으로 이루어져 있다. N은 테스트 케이스의 번호이고, M은 문제에서 설명한 m이다.

www.acmicpc.net

주어지는 각 M에 대하여 연속한 두 피보나치 수의 M으로 나눈 나머지가 각각 0과 1이 될 때까지 다음 피보나치 수를 찾는 것으로 문제를 해결하자.

 

주어지는 M 값에 대하여 피사노 주기의 합이 50만 이하로 주어지므로 주기에 비례한 시간에 각 테스트케이스의 답을 구하는 이 방법으로 문제를 충분히 해결할 수 있음을 알 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int T, t, M;
int x = 1, y = 1;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> T;
	while (T--) {
	    cin >> t >> M;
	    int ans = 1;
	    x = 1, y = 1;
	    while (!(x == 0 && y == 1)){
	        int tmp = (x + y) % M;
	        x = y;
	        y = tmp;
	        ans++;
	    }
	    
	    cout << t << ' ' << ans << '\n';
	}
	
	return 0;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2731 // C++] 1379와 세제곱  (1) 2024.01.09
[BOJ 8322 // C++] (K,N)-나이트  (1) 2024.01.08
[BOJ 2799 // C++] 블라인드  (1) 2024.01.06
[BOJ 2737 // C++] 연속 합  (1) 2024.01.05
[BOJ 7117 // C++] Sevens, twos and zeros  (0) 2024.01.04

+ Recent posts