HDU-4190-Number Sequence-容斥原理+多重集和的r组合
【Problem Description】
给你\(n\)个数\(b_i\),问有多少个长度为\(n\)序列\(a_i\),使得\(a_1\cdot a_2\dots a_n=b_1\cdot b_2\dots b_n\)。且\(a_i>1\)。
【Solution】
将所有\(b_i\)分解质因数,并分别统计每个质因数出现的次数,那么可以肯定,所有的\(a_i\)一定是从这些质因数中选取不同的组合相乘得到的。
假设没有\(a_i>1\)的限制,然后假设所有的\(b_i\)共有\(3\)个质因子,每个质因子出现的次数分别为\(a,b,c\)次。则总共有\({a+n-1\choose n-1}\cdot {b+n-1\choose n-1}\cdot {c+n-1\choose n-1}\)种长度为\(n\)的\(a_i\)序列。即类似总共有\(n\)个不同的盒子,将\(a\)个红球,\(b\)个蓝球,\(c\)个绿球放进这\(n\)个盒子中有多少种不同的方案,可以使得。
但是现在求得的答案数包括了\(a_i=1\)的情况,需要去除,即减去\(1\)个位置为空的方案数,再加上\(2\)个位置为空的方案数,再减去\(\dots\)等等。\(i\)个位置为空的方案数为\({n\choose i}\cdot {a+n-1-i\choose n-1-i}\cdot {b+n-1-i\choose n-1-i}\cdot {c+n-1-i\choose n-1-i}\)。即先从\(n\)个盒子种选\(i\)个位置,有\({n\choose i}\)种方案,然后再乘以将\(a\)个红球,\(b\)个蓝球,\(c\)个绿球放进\(n-i\)个盒子中的方案数。
【Code】
#include
#include
#include