hdu4390 容斥原理

突然發現以前沒坐過數學題,,菜菜菜啊、、、看了下題目,知道用容斥原理,但好多什麼分解質因數,什麼的都不會

,於是搜了下別人博客,然後纔會的、、現在開始做點數學題。。up~~

比較簡單的題目:分解質因數 對於每個因子的指數p分給n個數,方案數就是多重組和c(n+p-1,p)但是ai>1所以用個容斥原理就ok

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
const int mod=1000000007;
using namespace std;
typedef long long LL;
vector<int>vt;
LL c[505][505];
int a[1010];
int n;
void gao(int x)
{
	for(int i=2;i*i<=x;i++)
	{
		while(x%i==0)
		{
			x/=i;
			vt.push_back(i);
		}
	}
	if(x>1)vt.push_back(x);
}
void init()
{
	for(int i=0;i<=500;i++)
	{
		c[i][0]=c[i][i]=1;
		for(int j=1;j<i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
	}
}
LL Dp()
{
	sort(vt.begin(),vt.end());
	int cnt=0;
	a[cnt]=1;
	for(int i=1;i<vt.size();i++)
	{
		if(vt[i]!=vt[i-1]) a[++cnt]=1;
		else
			a[cnt]++;
	}
	LL ans=1;
	for(int i=0;i<=cnt;i++)ans=(ans*c[n+a[i]-1][a[i]])%mod;
	for(int i=1;i<=n-1;i++)
	{
		LL tmp=c[n][i];
		for(int j=0;j<=cnt;j++)
			tmp=(tmp*c[n-i+a[j]-1][a[j]])%mod;
		if(i&1)ans=(ans-tmp+mod)%mod;
		else
			ans=(ans+tmp+mod)%mod;
	}
	return ans;
}
int main()
{
	init();
	while(1==scanf("%d",&n))
	{
		vt.clear();
		for(int i=0;i<n;i++)
		{
			int k;
			scanf("%d",&k);
			gao(k);
		}
		printf("%lld\n",Dp());
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章