先对每个数 质数分解。

假如有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;
	}
}