题目链接
- 可重组合(从集合中选取的元素可重复):把选数视为将相同的小球放到不同的盒子中,然后再用隔板法处理,结论是$\binom{n+r-1}{r} $,其实也等价于有限制的多重集的组合数
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
const int inv2=500000004;
const int inv3=333333336;
long long f[405];
int c(long long n,int m)
{
if(m==2)
{
return (n*(n-1)/2)%mod;
}
else
{
return n*(n-1)%mod*(n-2)%mod*inv2%mod*inv3%mod;
}
}
int main()
{
int n;
cin>>n;
f[0]=1;
f[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<i;j++)
{
for(int k=j;j+k<i;k++)
{
int l=i-j-k-1;
if(l<k)
{
break;
}
if(j==l)
{
f[i]+=c(f[j]+3-1,3);
}
else if(j==k)
{
f[i]+=(c(f[j]+2-1,2)*f[l]%mod);
}
else if(k==l)
{
f[i]+=(f[j]*c(f[k]+2-1,2)%mod);
}
else
{
f[i]+=(f[j]*f[k]%mod*f[l]%mod);
}
f[i]%=mod;
}
}
}
cout<<f[n]<<endl;
return 0;
}