这道题我一上来只会80
还是要感谢题解区大佬题解的帮助
先考虑若\(xy,xz\)为完全平方数,则\(yz\)也为完全平方数,因为\(xy*xz=x^2yz\)为完全平方数,除掉\(x^2\)就行了
所以所有两两乘积为完全平方数的数可以放在一个集合中,用并查集合并即可.
若每个并查集都是一种颜色,所以现在问题变成有\(m\)种颜色的互不相同的球,每种颜色的球有\(b_i\)个,问多少种球的排列满足同色球不相邻
先把所有球按颜色大小排个序,然后考虑dp,设\(f[i][j][k]\)表示前\(i\)个球,有\(j\)个和\(i\)不同色且相邻的同色球对数,有\(k\)个和\(i\)同色且相邻的同色球对数的方案
如果当前球与上一个球不同色,那么考虑把这个球插入到同色球之间,方案为\(f[i-1][k][j-k+1]*(j+1)\)
插到异色球中,方案为\(f[i-1][k][j-k]*(i-j)\)
如果该球与上一个球颜色相同,这里先设\(cnt\)表示前面放了几个这样颜色的球
把这个球插到和这个球同色的球旁边,方案为\(f[i-1][j][k-1]*(cnt*2-(k-1))\)
插到其他同色球之间,方案为\(f[i-1][j+1][k]*(j+1)\)
插到其他异色球之间,方案为\(f[i-1][j][k]*(i-(cnt*2-k+j))\)
答案就是\(f[n][0][0]\)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include