algorithm

λ°±μ€€ 2482

rkawk 2024. 6. 26. 23:08

문제

더보기

색을 ν‘œν˜„ν•˜λŠ” κΈ°λ³Έ μš”μ†Œλ₯Ό μ΄μš©ν•˜μ—¬ ν‘œμ‹œν•  수 μžˆλŠ” λͺ¨λ“  색 μ€‘μ—μ„œ λŒ€ν‘œμ μΈ 색을 고리 λͺ¨μ–‘μœΌλ‘œ μ—°κ²°ν•˜μ—¬ λ‚˜νƒ€λ‚Έ 것을 μƒ‰μƒν™˜μ΄λΌκ³  ν•œλ‹€. 미ꡭ의 ν™”κ°€ λ¨Όμ…€(Munsell)이 ꡐ윑용으둜 κ³ μ•ˆν•œ 20μƒ‰μƒν™˜μ΄ 널리 μ•Œλ €μ Έ μžˆλ‹€. μ•„λž˜ 그림은 λ¨Όμ…€μ˜ 20μƒ‰μƒν™˜μ„ 보여쀀닀.

 

κ·Έλ¦Ό 1. λ¨Όμ…€μ˜ 20μƒ‰μƒν™˜

μƒ‰μƒν™˜μ—μ„œ μΈμ ‘ν•œ 두 색은 λΉ„μŠ·ν•˜μ—¬ μ–Έλœ» 보면 κ΅¬λ³„ν•˜κΈ° μ–΄λ ΅λ‹€. μœ„ 그림의 20μƒ‰μƒν™˜μ—μ„œ 닀홍은 λΉ¨κ°•κ³Ό μΈμ ‘ν•˜κ³  또 주황과도 μΈμ ‘ν•˜λ‹€. 풀색은 연두, 녹색과 μΈμ ‘ν•˜λ‹€. μ‹œκ°μ  λŒ€λΉ„ 효과λ₯Ό μ–»κΈ° μœ„ν•˜μ—¬ μΈμ ‘ν•œ 두 색을 λ™μ‹œμ— μ‚¬μš©ν•˜μ§€ μ•ŠκΈ°λ‘œ ν•œλ‹€.

μ£Όμ–΄μ§„ μƒ‰μƒν™˜μ—μ„œ μ‹œκ°μ  λŒ€λΉ„ 효과λ₯Ό μ–»κΈ° μœ„ν•˜μ—¬ μ„œλ‘œ μ΄μ›ƒν•˜μ§€ μ•Šμ€ 색듀을 μ„ νƒν•˜λŠ” 경우의 수λ₯Ό 생각해 보자.  λ¨Όμ…€μ˜ 20μƒ‰μƒν™˜μ—μ„œ μ‹œκ°μ  λŒ€λΉ„ 효과λ₯Ό 얻을 수 있게 10개의 색을 μ„ νƒν•˜λŠ” 경우의 μˆ˜λŠ” 2μ΄μ§€λ§Œ, μ‹œκ°μ  λŒ€λΉ„ 효과λ₯Ό 얻을 수 있게 11개 μ΄μƒμ˜ 색을 선택할 수 μ—†μœΌλ―€λ‘œ 이 경우의 μˆ˜λŠ” 0이닀.

μ£Όμ–΄μ§„ μ •μˆ˜ Nκ³Ό K에 λŒ€ν•˜μ—¬, N개의 μƒ‰μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ” μƒ‰μƒν™˜ (Nμƒ‰μƒν™˜)μ—μ„œ μ–΄λ–€ μΈμ ‘ν•œ 두 색도 λ™μ‹œμ— μ„ νƒν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μ„œλ‘œ λ‹€λ₯Έ K개의 색을 μ„ νƒν•˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

풀이

숫자의 λΆ„ν• λ‘œ ν’€μ—ˆλ‹€. 

μƒ‰μƒν™˜μ΄ μ›ν˜•μœΌλ‘œ λ˜μ–΄μžˆλ‹€λŠ” 점에 μ£Όμ˜ν•˜κ³  ν’€λ©΄ λœλ‹€.

μ„œλ‘œ λ–¨μ–΄μ ΈμžˆλŠ” K개의 μƒ‰μƒμ˜ 경우의 수λ₯Ό 총 N개의 μƒ‰μƒμ—μ„œ 뽑아야 ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

이λ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ (총 6개의 μƒ‰μƒμ—μ„œ 3개λ₯Ό μ„ νƒν•˜λŠ” 경우λ₯Ό λ‚˜νƒ€λ‚΄λ©΄)

1. 무쑰건 첫번째 색을 μ„ νƒν•˜λŠ” 경우 (νŠΉμ • 색을 κΈ°μ€€μœΌλ‘œ μ„ ν˜•μœΌλ‘œ λ‚˜νƒ€λƒˆμ„λ•Œ)

2. 무쑰건 λ§ˆμ§€λ§‰ 색을 μ„ νƒν•˜λŠ” 경우 (νŠΉμ • 색을 κΈ°μ€€μœΌλ‘œ μ„ ν˜•μœΌλ‘œ λ‚˜νƒ€λƒˆμ„λ•Œ)

3. 첫번째 색, λ§ˆμ§€λ§‰ 색을 μ„ νƒν•˜μ§€ μ•ŠλŠ” 경우

 

λ‹€μŒκ³Ό 같이 μ„Έκ°€μ§€ μΌ€μ΄μŠ€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. (Oκ°€ 색상 선택, Xκ°€ 색상 비선택)

1, 3번 μΌ€μ΄μŠ€λŠ” N - K개의 색상을 무쑰건 K개의 숫자둜 λΆ„ν• ν•˜λŠ” 경우

2번 μΌ€μ΄μŠ€λŠ” N - K 개의 색상을 무쑰건 K+1개의 숫자둜 λΆ„ν• ν•˜λŠ” κ²½μš°μ΄λ‹€.

λͺ¨λ“  경우의 수λ₯Ό λ‹€ 더해주면 λœλ‹€.

 

νŠΉμ •ν•œ 숫자λ₯Ό K개둜 λΆ„ν• ν•˜λŠ” 경우의 μˆ˜λŠ” DPλ₯Ό 톡해 μ‰½κ²Œ ꡬ할 수 μžˆλ‹€.

 

#include <iostream>
#define ll long long
#define MODNUM 1000000003
using namespace std;
ll N, K, dp[1001][1001];
int main() {
    cin>>N>>K;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++) {
            if(i == j) dp[i][j] = 1;
            else {
                dp[i][j] = (dp[i-1][j] + dp[i-1][j-1])%MODNUM;
            }
        }
    cout<<(dp[N-K][K]*2 + dp[N-K][K+1])%MODNUM;
}