Algorithm/BOJ
[C/C++] 백준 9471번 - 피사노 주기
poopooreum
2025. 1. 8. 08:26
반응형
✏️ 문제 링크
https://www.acmicpc.net/problem/9471
✏️ 문제 설명
✏️ 로직(처음)
- 피사노 주기 찾아보기
- arr[i] = (arr[i-1] + arr[i-2]) % m
- arr[i-1]과 arr[i-2]가 1일 때의 반복횟수를 리턴해준다
- 배열로 하니 메모리도 많이 사용하고 문제에서 요구하는 사항을 맞추지 못할 것 같아서 단순 반복문 이용
✏️ 코드
#include<bits/stdc++.h>
using namespace std;
long long arr[1000001];
long long int fun(long long int m) {
if (m==2)
return 3;
if (m==3)
return 8;
for (long long i = 3; i <= m * m; i++) {
arr[i] = (arr[i - 1] % m + arr[i - 2] % m) % m;
if (arr[i-1] ==1 && arr[i - 2] == 1 && i>3) {
return i-3;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t, n;
long long int m;
cin>>t;
arr[1]=1;
arr[2]=1;
while(t--) {
cin >> n >> m;
int rate = fun(m);
cout << n << " " << rate << "\\n";
}
}
#include<bits/stdc++.h>
using namespace std;
long long arr[1000001];
long long int find_pisano(long long int m) {
if (m==2)
return 3;
if (m==3)
return 8;
for (long long i = 3; i <= m * m; i++) {
arr[i] = (arr[i - 1] + arr[i - 2]) % m;
if (arr[i-1] ==1 && arr[i - 2] == 1 && i>3) {
return i-3;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t, n;
long long int m;
cin>>t;
arr[1]=1;
arr[2]=1;
while(t--) {
cin >> n >> m;
cout << n << " " << find_pisano(m) << "\\n";
}
}
#include<bits/stdc++.h>
using namespace std;
long long int find_pisano(long long int m) {
long long a = 1, b = 1;
long long rate = 0;
while (true) {
long long c = (a + b) % m;
a = b;
b = c;
rate ++;
if (a==1 && b==1)
return rate;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t, n;
long long int m;
cin >> t;
while (t--) {
cin >> n >> m;
cout << n << " " << find_pisano(m) << "\\n";
}
}
✏️ 느낀 점
음 솔직히 이게 왜 맞는지를 모르겠다. 피사노 주기는 m≤ m^2 - 1까지를 허용하는데 내가 한 경우에서는 m이 1000000까지인 경우만 계산이 되는데 저때까지 주기를 못 구하면 틀리는 풀이가 아닌가? 세 번째 풀이가 맞는 풀이 같음
✏️ 결과
다른사람들을 보니 보통 4ms가 걸려서 내 풀이를 다시 보니 굳이 나머지 연산을 한 줄에서 3번을 할 필요가 없어 보여서 나머지 연산 횟수를 줄였더니 8ms가 줄었다.
반응형