알고리즘

백준 16565 : N포커 (C++)

ciel45 2025. 1. 23. 21:01

https://www.acmicpc.net/problem/16565

 

생각의 흐름:

 

 

 

소스 코드:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

#define int long long
#define MOD % 10007

int N;
int dpC[53][53];
int dpF[53][53];

int C(int n, int r)
{
	if (dpC[n][r] != -1)
		return dpC[n][r];

	if (n == r || r == 0)
	{
		return dpC[n][r] = 1;
	}
	return dpC[n][r] = C(n - 1, r - 1) + C(n - 1, r);
}

// n장 중 k장을 포카드 없이 뽑는 경우의 수
int F(int n, int k)
{
	if (dpF[n][k] != -1)
		return dpF[n][k];

	if (k < 4)
	{
		return dpF[n][k] = C(n, k);
	}

	int total = C(n, k);

	int includingFourCard = 0;

	int maxPairCount = k / 4;
	for (int i = 1; i <= maxPairCount; i++)
	{
		// 포카드가 i쌍 존재하도록 하는 경우의 수
		includingFourCard += C(n/4, i) * F(n - i * 4, k - i * 4);
	}

	return dpF[n][k] = total - includingFourCard;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	memset(dpC, -1, sizeof(dpC));
	memset(dpF, -1, sizeof(dpF));

	cin >> N;

	int maxPairCount = N / 4;
	int includingFourCard = 0;
	for (int i = 1; i <= maxPairCount; i++)
	{
		int a = C(13, i) * F(52 - i * 4, N - i * 4);
		// 포카드가 i쌍 존재
		includingFourCard += a;
	}

	cout << includingFourCard MOD;
}

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

백준 13302 : 리조트 (C++)  (0) 2025.02.19