链接:https://www.hackerrank.com/contests/hourrank-29/challenges/array-partition
给n个数,让你将这n个数拆分成两个集合,使得两个集合分别乘积互质,求拆分方案数。
第一次打Hackerrank,一个小时三道题还是很刺激的。这道题比赛的时候没调出来,只拿了部分分,有点遗憾啊~)ps:衣服还是很难拿的,top10 才有,这场出现了tourist等众神牛,这种场拿衣服还是不想了。
根据题目的要求,显然拥有相同因数的数字必须呆在同一个集合(1除外,这是个trick,后面会说),考虑用一个方法,将所有拥有至少一个公共因数的数字划为同一个集合,然后再对所有不连通的集合进行计数,会发现:当有$n$个集合的时候,我们的划分方案数为$2^{n}-2$。
很显然可以用并查集维护每一个数的因数的连通情况,因此我们在枚举每一个数的因数的同时,将因数和这个数并到一起就可以了。这里需要特别注意的是,每一个1都可以分到一个单独的集合里,因此计数的时候需要单独考虑~
整体复杂度为$O(n\sqrt{n})$
1 | typedef long long LL; |