题目链接:
题意:给出n个数字b1,b2,……,bn。求有多少个有序序列a1,a2,……,an,满足b1*b2*……*bn=a1*a2*……*an?(ai>1)
思路:首先分解质因数,存下每个质因子出现的次数。其次,容斥原理还是比较好想的,设f[n]表示n个数字(可以有1),那么
P是出现的素数集合。f[n]的计算是这样的。对于每个素数,其出现的次数m,那么就相当于将m个无区别的物品放到n个有区别的盒子,为C(n+m-1,n-1)。
int a[N][2],aNum;void add(int x,int t){ int i; for(i=1;i<=aNum;i++) { if(a[i][0]==x) { a[i][1]+=t; return; } } aNum++; a[aNum][0]=x; a[aNum][1]=t;}i64 C[N][N];void init(){ int i,j; C[0][0]=1; for(i=1;i1) add(n,1);}i64 cal(int t){ i64 ans=1,i; FOR1(i,aNum) (ans*=C[t+a[i][1]-1][t-1])%=mod; return ans;}int main(){ init(); Rush(n) { aNum=0; int i,x; FOR1(i,n) RD(x),deal(x); i64 ans=0; for(i=0;i