突然發現以前沒坐過數學題,,菜菜菜啊、、、看了下題目,知道用容斥原理,但好多什麼分解質因數,什麼的都不會
,於是搜了下別人博客,然後纔會的、、現在開始做點數學題。。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;
}