一、题目
二、解法
计数 d p dp dp神题,真的强!!
首先必须要知道一个结论,如果 a × b a\times b a×b是完全平方数, a × c a\times c a×c是完全平方数,那么 b × c b\times c b×c一定是完全平方数,证明可以从指数的奇偶性考虑(感性理解一下吧)。
这告诉我们两两乘积为完全平方数的可以划分成一堆,堆中相乘一定为平方数,不同堆相乘一定不为完全平方数,这样就很大程度上简化了问题。
考虑 d p dp dp,设 f [ i ] [ j ] f[i][j] f[i][j]为前 i i i个堆中有 j j j个位置不合法的方案数(因为不合法的方案可以由后面堆的插入变得合法),转移的话我们考虑每个堆,先把该堆排序,方案数为 n u m [ i ] ! num[i]! num[i]!( n u m num num为堆中元素个数),然后把排序后的堆划分成 k k k块,方案数为 C ( n u m [ i ] − 1 , k − 1 ) C(num[i]-1,k-1) C(num[i]−1,k−1)(相当于插板子),易知这样会造成 n u m [ i