※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 24924번 문제인 Card Divisibility이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/24924
24924번: Card Divisibility
Since you have learned Modular Arithmetic, you know how to work with quotients and remainders. For every pair of integers $a$ and $m$ with $m>0$, there exist unique integers $q$ and $r$ such that $a=m⋅q+r$ and $0≤r<m$. But this is a bit simple, y
www.acmicpc.net
9의 배수의 잘 알려진 특징 하나를 먼저 상기하고 넘어가자. 바로 x의 모든 자릿수의 합이 또다시 9의 배수가 된다는 것이다.
위 특징의 증명을 조금 더 생각해보면, 임의의 자연수 n에 대하여 n을 9로 나눈 나머지는 n의 모든 자릿수의 합을 9로 나눈 나머지와 같다는 것을 알 수 있다.
n을 9로 나눈 나머지는 n을 이루는 각 자릿수들의 합만으로도 구할 수 있으므로, L부터 R까지를 이어써서 만든 수를 9로 나눈 나머지 또한 L부터 R까지의 수를 이루는 각 자리들의 합을 9로 나눈 나머지와 같다는 것을 알 수 있다.
이들을 다시 L부터 R까지의 각각의 수 단위로 끊어 거꾸로 생각하면, 결국 구하는 값은 L부터 R까지의 각 수의 총합을 9로 나눈 나머지와 같다는 것을 생각해낼 수 있다.
__int128을 이용하여 L부터 R까지의 수의 총합, 즉 "(R-L+1)*(L+R)/2"를 9로 나눈 나머지를 계산하자.
__int128을 사용하지 않고 해결할 수 있는 방법도 있다. 0부터 8까지의 수를 더하면 9의 배수가 된다는 점을 이용하여, 연속한 9개의 수들은 직접 더하지 않아도 된다는 점을 이용하는 것이다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef __int128 int128;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll L, R; cin >> L >> R;
int128 LL = L, RR = R;
int ans = (int)(((RR - LL + 1) * (L + R) / 2) % 9);;
cout << ans;
}
'BOJ' 카테고리의 다른 글
[BOJ 25083 // C++] 새싹 (0) | 2022.05.01 |
---|---|
[BOJ 24302 // C++] КУРИЕРИ (0) | 2022.05.01 |
[BOJ 24923 // C++] Canadians, eh? (0) | 2022.05.01 |
[BOJ 24977 // C++] Visits (0) | 2022.04.30 |
[BOJ 24978 // C++] Subset Equality (0) | 2022.04.29 |