hdu 4390 隔板 容斥

2021-08-03 23:02:18 字數 1751 閱讀 4118

given a number sequence b 1,b 2…b n.

please count how many number sequences a 1,a 2,…,a n satisfy the condition that a 1*a 2*…a n=b 1*b 2…*b n (a i>1).

input

the input consists of multiple test cases.

for each test case, the first line contains an integer n(1<=n<=20). the second line contains n integers which indicate b 1, b 2,…,b n ( 1 < b i<=1000000, b 1*b 2*…*b n<=10 25).

output

for each test case, please print the answer module 1e9 + 7.

sample input

2 3 4

sample output

4hint

for the sample input, p=3*4=12.

here are the number sequences that satisfy the condition:

2 6

3 4

4 3

6 2題意: 給你一行a n個數,讓你找出有多少種相同長度的數的排列的乘積a的乘積相等,而且規定每個數都要大於0。

先分解質因數,因為相同質因素的乘積相等,而且質因素的乘積,決定了數的值,然後對於每個質因子的數量進行單獨的隔板法分配,但是這樣求出來的結果是包括1的,然後就是減掉 至少1個為1的數的排列,容斥一下就好。

#include 

using

namespace

std;

const

int n = 1010;

typedef

long

long ll;

const

int mod = 1e9+7;

ll fac[n+100];

ll inv[n+100];

map mp;

const

int mp = 1e3+5;

int p[mp];

int prear,vis[mp];

ll qpow(ll a,ll b)

return res;

}void init()

inv[n]=qpow(fac[n],mod-2);

for(int i=n-1;i>=0;i--)

inv[i]=(inv[i+1]*(i+1))%mod;

}void prime_init()

}void func(int x)

}if(x!=1) mp[x]++;

}ll c(int a,int b)

ll fen(int a,int b)

int main()

ll ans=0;

for(int i=0;ifor(map

::iterator iter=mp.begin();iter!=mp.end();iter++)

if(i%2==0) ans+=res,ans%=mod;

else ans=(ans-res+mod)%mod;

}printf("%lld\n",ans);

}}

51Nod 1509 加長棒(隔板法 容斥)

思路 正面想似乎不大好想,本著正難則反的原則。我是看的題解 我們想組不成三角形的方案,然後用總的方案 不能組成的方案。總的方案數就是 使得 x y z l x y z l x y z l 的方案,這顯然可以用隔板法求,三個邊 相當於三個盒子,然後有l ll個球可以放到裡面,因為這裡是小於等於l ll...

Devu和鮮花(組合數學(隔板法,容斥)

傳送門 首先我們知道,把m個小球放進n個桶裡,桶可以為空的問題,答案是cal m n 1,n 1 在實際中有x1 a1,x2 a2,x3 a3 xn an等條件,此時就需要同時滿足這n個條件,也就是有的桶裡面的球超出了他的容量,所以就考慮容斥。也就是至少不滿足其中乙個條件的方案。就可以用總方案減去這...

hdu 4336 容斥原理

按照解題報告的提示,用容斥原理實現 for int j bg 1 j另解 概率dp,康哥指導的 include include includeusing namespace std double f 1 21 gl 22 int main int i,j,k,n double fz,fm while...