烷基计数

  • 可重组合:把选数视为将相同的小球放到不同的盒子中
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
const int inv2=500000004;
const int inv3=333333336;
long long f[405];
int power(int n,int p)
{
	if(p==0)
	{
		return 1;
	}
	else
	{
		long long tmp=power(n,p/2);
		if(p%2==0)
		{
			return tmp*tmp%mod;
		}
		else
		{
			return tmp*tmp%mod*n%mod;
		}
	}
}
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:35  D06  阅读(1)  评论(0编辑  收藏  举报