BOJ 1419 등차수열의 합 - c++

JaeHun Leem·2023년 12월 20일
1

백준

목록 보기
1/2
post-thumbnail

등차수열의 합

📖문제


첫 항이 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;
}

0개의 댓글