先对每个数 质数分解。
假如有m个质因子,每个质因子有ai个;n个数
然后容斥原理。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll __int64
ll a[20],b[2000],cc[20],d[2000];
ll c[50][50];
ll mod=1e9+7;
int t;
ll C(ll n,ll k)
{
if(c[n][k]!=-1) return c[n][k];
if(k==1) return c[n][k]=n;
if(k==0) return c[n][k]=1;
if(n==k) return 1;
if(k > (n>>1)) return c[n][k]=C(n,n-k);
return c[n][k]=(C(n-1,k-1)+C(n-1,k))%mod;
}
ll calc(ll n,ll m,ll k)
{
ll ans=1,i;
for(i=0;i<t;i++)
{
ll t=C(n+d[i],n);
ans=(ans*t)%mod;
}
ans=(ans*C(m,k))%mod;
return ans;
}
int main()
{
ll n;
memset(c,-1,sizeof(c));
while(cin>>n)
{
ll i,j,k,cnt=0;
memset(b,0,sizeof(b));
memset(cc,0,sizeof(cc));
for(i=0;i<n;i++)
{
cin>>k;
for(j=2;j*j<=k;j++)
{
if(k%j==0)
{
while(k%j==0)
{
b[j]++;
k/=j;
}
}
}
if(k!=1){
if(k<=1000) b[k]++;
else
{
int flag=0;
for(j=0;j<cnt;j++)
if(k==a[j]){
cc[j]++;
flag=1;
}
if(flag==0){
a[cnt]=k;
cc[cnt]++;
cnt++;
}
}
}
}
t=0;
for(i=2;i<=1002;i++)
{
if(b[i])
d[t++]=b[i];
}
for(i=0;i<cnt;i++)
d[t++]=cc[i];
ll res=0;
for(i=0;i<n;i++)
{
if(i%2==0)
res=(res+calc(n-1-i,n,i))%mod;
else
res=(res+mod-calc(n-1-i,n,i))%mod;
}
cout<<res<<endl;
}
}