이항계수 2 팩토리얼 값 미리 다이나믹으로 구해두고 나눠서 풀려고 했는데
나머지 연산이라 n은 본래 큰 값이지만 나머지는 n-m의 값보다 작을 수 있다. 해결할 방법이 지금 생각나지 않음.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits.h>
#include <stack>
using namespace std;
typedef long long ll;
ll stb[10001]; // single table
ll sche[100001]; // single cache
int tb[1001][1001];
int cache[1001][1001];
int n,m;
int facto(int num) {
       cout << num << endl;
       if (num == 0) {
              return 1;
       }
       if (sche[num] != -1) {
              return sche[num];
       }
       sche[num] = ((num%10007) * (facto(num - 1)%10007))%10007;
       cout << sche[num] << endl;
       return sche[num];
}
int main(void) {
       memset(sche, -1, sizeof(sche));
       cin >> n >> m;
       if (n == m || m == 0) {
              cout << 1 << endl;
              return 0;
       }
       facto(n);
       cout << sche[n] / sche[n - m] / sche[m] ;
       
       return 0;
}


이게 해법 곱하기와 나누기 말고 합으로 해결 가능했다. 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits.h>
#include <stack>
using namespace std;
typedef long long ll;
ll stb[10001]; // single table
ll sche[100001]; // single cache
int tb[1001][1001];
int cache[1001][1001];
int n,m;
int main(void) {
       
       cin >> n >> m;
       if (n == m || m == 0) {
              cout << 1 << endl;
              return 0;
       }
       cache[0][0] = cache[1][0] = cache[1][1] = 1;
       for (int i = 2; i <= n; ++i) {
              cache[i][0] = cache[i][i] = 1;
              for (int j = 1; j <= i-1; ++j) {
                     cache[i][j] = cache[i - 1][j - 1]%10007 + cache[i - 1][j]%10007;
              }
       }
       cout << cache[n][m]%10007;
       
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DP] 백준 9084 동전  (0) 2018.04.29
[EAZY] 백준 15624 피보나치 7  (0) 2018.04.02
[DP] 백준 1965 상자넣기  (0) 2018.04.02
[EASY] 백준 2167 2차원 배열의 합  (0) 2018.04.02
[DP] 백준 14916 거스름돈  (0) 2018.04.02

+ Recent posts