1개의 댓글이 있습니다.
-
-
Being -
제가 짜 본 A 코드: http://ideone.com/DnhCq
16년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
제가 짜 본 A 코드: http://ideone.com/DnhCq
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
Toivoa
R1A에서 999/1000 으로 올라간 기념으로 연습 삼아 R1B 풀어봤습니다. :)
[A. File Fix-it]
현재 디렉토리의 상태가 주어지고, 추가할 디렉토리들이 주어질 때 mkdir 명령을 최소 몇 번 수행해야 하는지 묻는 문제입니다. 코드잼의 특성상 실제로 mkdir을 하는 코드를 작성한 분도 있는데...
C++로 푼다면 다음과 같이 적절히 string parsing을 해서 directory를 구성해주시면 됩니다.
~~~ cpp
#include
#include
#include
[C. Your Rank is Pure]
문제는 {2, ..., N} 까지의 숫자의 subset을 선택했을 때 N이 pure인 subset의 가지 수를 세는 문제입니다. N이 pure라는 것은 문제의 도입 부분에서와 같이 소수의 집합에서 127은 31번째 소수이고, 31은 11번째 소수이고, 11은 5번째 소수이고, 5는 3번째 소수이고, 3은 2번째 소수, 2는 첫번째 소수 와 같은 식으로 1이 나올 때까지 그 집합 내에서 벗어나지 않는 경우를 말합니다.
저는 다음과 같은 table을 만들어서 풀었습니다.
T[x, y]: x를 subset의 y번째 두었을 때의 가지 수.
T[i, 1] = 1 // trivial.
T[i, j] = sum(T[j, k] * C[i - j - 1, j - 1 - k]) // (1 <= k < j). C는 조합입니다.
-> i를 j번째 놓는다면 j는 반드시 그 subset에 있어야 합니다. (j를 k번째에 놓을 때의 가지 수) * ([k + 1 ... i - 1]의 빈 공간을 채울 수 있는 경우의 수) 들의 합이 됩니다.
소스코드는 다음과 같습니다.
~~~ cpp
#include
using namespace std;
typedef long long ll;
ll c[501][501];
ll a[501][501];
int main()
{
int t, n;
int cases = 0;
c[0][0] = 1;
for (int i = 1; i < 501; ++i)
{
for (int j = 0; j <= i; ++j)
{
if (j == 0 || j == i)
c[i][j] = 1;
else
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % 100003;
}
}
for (int i = 2; i < 501; ++i)
{
a[i][1] = 1;
for (int j = 2; j < i; ++j)
{
ll x = 0;
for (int k = 1; k < j; ++k)
{
x += a[j][k] * c[i - j - 1][j - 1 - k];
x %= 100003;
}
a[i][j] = x;
}
}
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
int r = 0;
for (int i = 0; i < n; ++i)
{
r += a[n][i];
r %= 100003;
}
printf("Case #%d: %d\n", ++cases, r);
}
}
16년 전