W ? (L > H ? L : H) : (W > H ? W : H)); double mid, result = 0; //실수 이분 탐색 for (int i = 0; i < 100; i++) { mid = (left + right) / 2.0; //중간값 long long count = (long long)(L / mid) * (long long)(W / mid) * (long long)(H / mid); if (count >= N) { //더 시도 result = mid; left = mid; } else { //A 줄이기 right = mid; } } printf("%.10lf", result); } "> W ? (L > H ? L : H) : (W > H ? W : H)); double mid, result = 0; //실수 이분 탐색 for (int i = 0; i < 100; i++) { mid = (left + right) / 2.0; //중간값 long long count = (long long)(L / mid) * (long long)(W / mid) * (long long)(H / mid); if (count >= N) { //더 시도 result = mid; left = mid; } else { //A 줄이기 right = mid; } } printf("%.10lf", result); } "> W ? (L > H ? L : H) : (W > H ? W : H)); double mid, result = 0; //실수 이분 탐색 for (int i = 0; i < 100; i++) { mid = (left + right) / 2.0; //중간값 long long count = (long long)(L / mid) * (long long)(W / mid) * (long long)(H / mid); if (count >= N) { //더 시도 result = mid; left = mid; } else { //A 줄이기 right = mid; } } printf("%.10lf", result); } ">

<aside> 1️⃣

문제: 1166번 선물

A × A × A 크기의 작은 정육면체 N개를 L x W x H 크기의 직육면체 박스에 모두 넣으려고 할 때 A의 최대값 구하기

</aside>


#include <stdio.h>
#include <math.h>

int main() {
    long long N, L, W, H;
    scanf("%lld %lld %lld %lld", &N, &L, &W, &H);

    //이분탐색을 통해 A의 최대값 찾기
    //이분 탐색 범위 지정
    double left = 0, right = (double)(L > W ? (L > H ? L : H) : (W > H ? W : H));
    double mid, result = 0;

    //실수 이분 탐색
    for (int i = 0; i < 100; i++) {
        mid = (left + right) / 2.0; //중간값

        long long count = (long long)(L / mid) * (long long)(W / mid) * (long long)(H / mid);

        if (count >= N) { //더 시도
            result = mid;
            left = mid;
        } else { //A 줄이기
            right = mid;
        }
    }

    printf("%.10lf", result);
}

image.png

<aside> 2️⃣

문제: 2407번 조합

nCm을 출력한다.

</aside>

#include <stdio.h>

//__int128 별칭
typedef __int128 i128;

//__int128 정수 출력 함수
void print_i128(i128 n) {
    if (n == 0) {
        putchar('0');
        return;
    }

    char buf[50];
    int idx = 0;

    //10진수 문자열로 변환
    while (n > 0) {
        buf[idx++] = (n % 10) + '0';  //마지막 자리 숫자를 문자로
        n /= 10;                      //다음 자리 숫자로
    }

    //버퍼에 저장된 역순 숫자 정방향 출력
    while (idx--) putchar(buf[idx]);
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m); 

    //조합 대칭 성질
    if (m > n - m) m = n - m;

    i128 result = 1;

    for (int i = 1; i <= m; i++) {
        result *= (i128)(n - i + 1); //분자 
        result /= i;                 //분모
    }

    print_i128(result);
}

/*
본래 아래같이 작성했는데 오버플로우 때문에 오답이 나옴

#include <stdio.h>

int main(){
    int n, m;
    scanf("%d %d", &n, &m);

    int top=1, bottom=1;
    for (int i = 0; i < m; i++){
        bottom *= (i+1);
        top *= (n-i);
    }
    int result;
    result = top/bottom;

    printf("%d", result);

}
*/

image.png