#include <stdio.h>

// 입력 : d(소수값을 확인하는 정수)
// 출력 : d가 소수이면 1, 아니면 0
int is_prime(int d)
{
    // i = 약수
    for (int i = 2; i < d; i++)
    {
        // 만약 d % i를 했는데 0이 나오면 i가 약수이므로 d는 소수가 아니니
        // 0을 리턴한다.
        if (d % i == 0) return 0;
    }
    // 2부터 d - 1까지 약수가 하나도 없다면 1을 리턴한다.
    return 1;
}

int main()
{
    long long n;

    scanf("%lld", &n);
    // a = 오늘 칭찬 스티커를 받은 학생 수
    // b = 지금까지 칭찬 스티커를 받은 학생 수
    long long a = 1, b = 1;

    // 3월 1일부터 스티커를 주기 시작하므로
    // month를 3, days를 1로 설정한다.
    int month = 3;
    int days = 1;
    // count에는 며칠이 걸리는지 저장하므로 1로 정해준다.
    int count = 1;
    while (1)
    {
        // 종료 조건 : 칭찬 스티커를 n 이상 받았을 경우
        if (b >= n)
        {
            printf("%d", count);
            return 0;
        }

        // days를 1 만큼 늘려서 시간이 갔음을 표현하고
        // count를 1 만큼 늘려 정답을 만든다.
        days++;
        count++;
        // 가장 큰 테스트 케이스의 정답이 4월 달 안에서 끝났으므로(n = 1e17일 떄 49일 걸림)
        // 3월 31 다음인 4월 1일로 설정
        if (days > 31)
        {
            // month를 1 올려 다음 달로 넘어가고
            // days를 1로 하여 다음달의 시작점을 저장시킨다.
            month++;
            days = 1;
        }
        // 칭찬 스티커 배급
        if (is_prime(days))
        {
            // days가 소수이므로 3을 곱해준다.
            a *= 3;
            // b에 a를 누적한다.
            b += a;
        }
        else
        {
            // days가 소수가 아니므로 2를 곱해준다.
            a *= 2;
            // b에 a를 누적한다.
            b += a;
        }
    }
}

'SFPC > 2021' 카테고리의 다른 글

2021 SFPC E0  (0) 2023.02.14
2021 SFPC E1  (0) 2023.02.14
2021 SFPC D0  (0) 2023.02.11
2021 SFPC C2  (0) 2023.02.10
2021 SFPC C1  (0) 2023.02.10
2021 SFPC C0  (0) 2023.02.10

+ Recent posts