[UVa 10943] How do you add? (计数+隔板法+重叠隔板)

UVa - 10943

将 N划分为 K个非负整数之和,求划分方案
和式中数的位置不同视作不同的方案
如 0+1=1 和 1+0=1是两种方案

把 N看作 N个 1,题目就转化为将这 N个 1分为 K份
很容易想到用隔板法,将 N个元素放入 K个盒子

隔板中的元素可以为空,即盒子中可以没有元素
那么就考虑盒子中至少有一个元素,求出来的所有情况
再从所有盒子拿一个元素,方案数相同
所以加入 K个元素,即求 N+K个元素用 K个隔板划分的方案数
为 C[N+K-1][K-1]

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Pow2(a) (a*a)

const LL MOD=1e6;
int N,K;
int comb[210][210];

void init();

int main()
{
    init();
    while(scanf("%d%d", &N, &K)&&N) printf("%d\n", comb[N+K-1][K-1]);
    return 0;
}

void init()
{
    for(int i=0; i<210; i++)
    {
        comb[i][0]=1;
        for(int j=1; j<=i; j++) comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%MOD;
    }
}

你可能感兴趣的:(uva)