알고리즘/백준

2407 조합

맛있는김치찜 2020. 10. 12. 01:31
#include <cstdio>
#include <cstdlib>
#include <iostream>
 
 
using namespace std;
const long long int maximum = 1e17; // 17자리씩 담아야지~
 
typedef struct big{ // 17자리씩 담아야지~
  long long int high = 0;  
  long long int low = 0;
}big;
 
big operator+(big a, big b) {
  big c;
  c.high = a.high + b.high;
 
  if (a.low + b.low > maximum) {
    c.low = a.low + b.low - maximum;
    c.high++;
  }
  else {
    c.low = a.low + b.low;
  }
  return c;
}
 
big memo[101][101];
 
big rec(int n, int k) { // nCk
  if (memo[n][k].low != 0 || memo[n][k].high != 0) {
  return memo[n][k];
  }
  else if (n <= 0) {
  return memo[n][k];
  }
  else if (k == 0 || n == k) {
    memo[n][k].low = 1;
    return memo[n][k];
  }
  else return memo[n][k] = rec(n - 1, k - 1) + rec(n - 1, k);
}
 
int main() {
  int n, m;
  big temp;
  scanf("%d %d", &n, &m);
  if (n - m < m) m = n - m;
  temp = rec(n, m);
  if (temp.high != 0) printf("%lld", temp.high);
  printf("%lld", temp.low);
  return 0;
}

조합이라고 해서 이항계수를 이용하면 쉽게 해결될 줄 알았는데 복병은 따로 있었다.

채점하는 케이스의 범위가 너무 커서 일반적인 자료형으로는 도저히 감당할 수 없었다.

그래서 아예 새로운 자료형을 만들었다.

앞 17자리, 뒤 17자리 총 34자리의 수를 표현할 수 있는 초대형 자료형이다.

이와 동시에 이항계수를 구하기 위해 이 자료형을 위한 +연산자도 오버로딩해서 정의했다.

'알고리즘 > 백준' 카테고리의 다른 글

4811 알약  (0) 2020.10.12
5557 1학년  (0) 2020.10.12
1926 그림  (0) 2020.10.12
2251 물통  (0) 2020.10.12
2234 성곽  (0) 2020.10.12