如何计算用c种不同颜色画n个不同的球的方法
How to calculate the ways to paint n different balls with exact c different colors?
我最近遇到了一个问题。
假设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),它可以用上面的公式计算。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?
- 开放式颜色多边形表面的最简单方法
- 为depth_first_search定义颜色图的最简单方法
- 调用Qpainter的方法绘制以刷新图像和更改颜色
- 使用OpenCV检测颜色的最有效方法
- 忽略特定颜色的更好方法-Blit
- C++:有没有一种简单的方法可以将十六进制颜色"0xff2a2620""映射到更具可读性的字符串"lovelyBrown"?
- 在C/ c++中访问X11颜色映射的标准方法是什么?
- 如何计算用c种不同颜色画n个不同的球的方法
- 什么是储存颜色的好方法?
- 更改 SetDlgItemText 颜色的正确方法是什么?
- 两种颜色相似度的量化方法
- 我如何使用不同的颜色为虚拟和虚拟纯方法
- 方法,允许我更改QwtPlot颜色背景