첫 항이 x이고 공차가 d인 등차수열의 첫 k개의 항은 x, x+d, x+2d, ..., x+(k-1)d이다. x와 d가 자연수인 등차수열의 첫 k개의 항의 합으로 나타낼 수 있는 수 중에서, l 이상이고 r 이하인 수가 몇 개인지 구하는 프로그램을 작성하시오.
자연수 l, r, k가 순서대로 한 줄에 하나씩 주어진다. (1 ≤ l ≤ r ≤ 1,000,000,000, 2 ≤ k ≤ 5)
첫째 줄에 조건을 만족하는 수의 개수를 출력한다.
k의 범위가 넓지 않아 (2<=k<=5) 하나 씩 케이스를 만들어서 푸는 것이 빠르다.
switch 문을 사용해 각각의 k에 맞는 case를 작성해 풀어보았다.
1) k=2 일 경우총 합이 2x+d이므로 3이상의 모든 자연수를 나타낼 수 있다.
2) k=3 일경우
총 합이 3x+3d이므로 3(x+d)로 보게 되면 치환을 통해 3y(여기서 y>=2)로 볼 수 있다. 즉 6이상의 모든 3의 배수를 나타낼 수 있다.
3) k=4 일경우
총 합이 4x+6d이므로 10 이상의 수 중에서 12를 제외한 나머지 짝수들을 나타낼 수 있다.
4) k=5 일경우
총 합이 5x+10d이므로 5(x+2d)로 보게 되면 치환을 통해 5y(여기서 y>=3)로 볼 수 있다. 즉 15이상의 모든 5의 배수를 나타낼 수 있다.
#include <iostream>
using namespace std;
int main() {
int left, right, k;
cin >> left >> right >> k;
switch (k) {
case 2: {
int result = max(right - max(left, 3) + 1, 0);
cout << result << endl;
break;
}
case 3: {
int count = 0;
int min_val = max(left, 6);
for (int i = min_val; i <= right; ++i) {
if (i % 3 == 0) {
count++;
}
}
cout << count << endl;
break;
}
case 4: {
int count = 0;
int min_val = max(left, 10);
for (int i = min_val; i <= right; ++i) {
if ((i % 2) == 0 && i != 12) {
count++;
}
}
cout << count << endl;
break;
}
case 5: {
int count = 0;
int min_val = max(left, 15);
for (int i = min_val; i <= right; ++i) {
if (i % 5 == 0) {
count++;
}
}
cout << count << endl;
break;
}
default:
cout << "Unsupported value of k" << endl;
}
return 0;
}