※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1215번 문제인 잘못 작성한 요세푸스 코드이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1215
1215번: 잘못 작성한 요세푸스 코드
첫 줄에 n과 k가 주어진다. (1 ≤ n, k ≤ 109)
www.acmicpc.net
N과 K가 주어질 때, K%1 + K%2 + ... + K%N 를 계산하는 문제이다.
이 문제에서 필요한 관찰은 1000%1000, 1000%999, 1000%998, ... , 1000%1을 순서대로 출력해보는 것으로 충분히 할 수 있을 것이다. 바로 K를 나눴을 때 몫이 같은 수들끼리 등차수열을 이루고 있다는 점이다.
brute force를 통해 나머지를 구해 더할 수 있을 정도의 적당한 범위 안으로 들어오면 브루트포스로 답을 구하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll N, K; cin >> N >> K;
ll idx = 2;
ll old = K;
ll ans = 0;
if (N > K) ans += (N - K) * K;
while (K / idx > 100000) {
ll current = K / idx;
if (current < N && N <= old) {
ll cnt = N - current;
ans += cnt * (K % N + K % (current + 1)) / 2;
}
else if (N > old) {
ll cnt = old - current;
ans += cnt * (K % old + K % (current + 1)) / 2;
}
old = current;
idx++;
}
if (old > N) old = N;
while (old) {
ans += K % old;
old--;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15817 // C++] 배수 공사 (0) | 2021.10.25 |
---|---|
[BOJ 2392 // C++] 다각형의 분할 (0) | 2021.10.24 |
[BOJ 6523 // C++] 요세푸스 한 번 더! (0) | 2021.10.22 |
[BOJ 1179 // C++] 마지막 요세푸스 문제 (0) | 2021.10.21 |
[BOJ 11025 // C++] 요세푸스 문제 3 (0) | 2021.10.20 |