烷基计数

题目链接

  • 可重组合(从集合中选取的元素可重复):把选数视为将相同的小球放到不同的盒子中,然后再用隔板法处理,结论是$\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;
}
posted @ 2024-07-07 20:36  D06  阅读(39)  评论(0)    收藏  举报
//雪花飘落效果