문제

https://www.acmicpc.net/problem/4375
4375번: 1
2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.
www.acmicpc.net
코드
첫 번째 시도(시간초과)
#include <iostream>
using namespace std;
int main(){
int n;
while(cin >> n){
int cnt = 1;
long long one = 1;
while(true){
if(one%n == 0){
break;
}
one=one*10+1;
cnt++;
}
cout << cnt << '\n';
}
return 0;
}
solution(modular연산 활용)
#include <iostream>
using namespace std;
int main(){
int n;
while(cin >> n){
int cnt = 1;
int one = 1;
while(true){
if(one%n == 0){
break;
}
one=one*10+1;
one%=n;
cnt++;
}
cout << cnt << '\n';
}
return 0;
}
정리
첫번째 시도에서 시간초과가 나왔다. one변수에 long long형의 범위를 넘어가는 수가 들어가는 경우가 있었기 때문이었다. 이 문제점을 해결하기 위해서는 다음과 같은 modular 연산의 특징을 이용해야 한다.
x mod N = (x mod N) mod N
우리는 one을 n으로 나눈 나머지가 0일 때 값을 알아낼 수 있다. 이 조건만 고려하면 되기 때문에 위 modular 연산 특징을 이용해 변수의 일정 범위를 넘지 않기 위해 매번 modular연산(one%=n)을 해주면 이 문제를 풀 수 있다.
참조
'Beakjoon > math' 카테고리의 다른 글
| [백준] 1929번 소수 구하기 (C++) (0) | 2022.03.26 |
|---|---|
| [백준] 17425번 약수의 합 (C++) (0) | 2022.03.25 |
| [백준] 17427번 약수의 합2 (C++) (0) | 2022.03.22 |
| [백준] 1978번 소수 찾기 (C++) (0) | 2022.01.06 |
| [백준] 2609번 최대공약수와 최소공배수 (C++) - Euclidean algorithm (0) | 2022.01.03 |