如何计算用c种不同颜色画n个不同的球的方法

How to calculate the ways to paint n different balls with exact c different colors?

本文关键字:颜色 方法 何计算 计算      更新时间:2023-10-16

我最近遇到了一个问题。

假设f(n,c) =用c种不同颜色画n个不同球的方法。(注意所有c种颜色必须至少使用一次,并且每个球都被认为是不同的)

对于这个问题,我需要计算所有的f(n,c)其中1<=c<=n<=S mod 1e9+7。

对于原问题,S=200。所以我做了一个O(S^3)的解,如下所示:

typedef long long ll;
ll MOD=1e9+7;
#define S 200
ll C[S+2][S+2],pows[S+2][S+2],sel[S+2][S+2];
ll sel_(int n,int c)
{
    ll ans=0; int cur=-1;
    for(int i=c;i>=1;i--)
    {
        cur*=-1;
        ans+=cur*pows[i][n]%MOD*C[c][i]%MOD;
        ans%=MOD;
    }
    return ans;
}
int main()
{
    for(int i=0;i<=S;i++)
    {
        C[i][0]=1; pows[i][0]=1;
        for(int j=1;j<=i;j++)
        C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;
        for(int j=1;j<=S;j++)
        pows[i][j]=pows[i][j-1]*i%MOD;
    }
    sel[0][0]=1;
    for(int i=1;i<=S;i++)
    {
        for(int j=1;j<=i;j++) sel[i][j]=sel_(i,j);
    }
    //the answers are stored in sel
}

但我想可能有一些方法可以在O(S^2)中求解它。我怎样才能做到呢?

这是包含排除原则的典型应用。让我们用f(n, k)表示用给n个球上色的方法的数量,最多可达 k种颜色(在原来的c种颜色之外),用g(n, k)表示用给n个球上色的方法的数量正好为 k种颜色(在原来的c种颜色之外)。然后是g(n, k) = f(n, k) - f(n, k - 1) + f(n, k - 2) - ...。用k种颜色来计算给球上色的方法要容易得多——实际上这个公式很简单,但我把它留给你去弄清楚它是什么。

最后你要找的数字是g(n, c),它可以用上面的公式计算。