题目很直白,方法就是暴力即可。
虽然说数据范围显得很大,但是在长整型范围内,一个数字的素因子数量最多不超64,而如果是不相同的素因子,虽然没有计算过,但是如果是12个不同的素因子应该会超过数据范围了。
所以果断采用找出所有素因子,再DFS做法。然而超时了.................
剪枝很容易处理,我们知道DFS算法是按顺序选择元素的,例如 2 2 3 3 3 序列,如果我们选择第一个2作为第一个元素,肯定无法形成序列,那么递归回去时下一次递归会选取第二个2作为首元,这种行为显然是没必要的。
#include <iostream>
using namespace std;
long long n,a[142]= {0},b[142]= {0},v[142],cnt=0,ok=1;
void dfs(long long step,long long pre)
{
if(step==cnt+1)
{
cout<<cnt<<endl;
for(int i=1; i<=cnt; i++)
cout<<b[i]<<' ';
ok=0;
return ;
}
for(int i=1; i<=cnt&&ok==1; i++)
{
if(a[i-1]==a[i]&&v[i-1]==0&&v[i]==0)/**< 加上这句就不超时了,相同的素因子没必要重复递归 */
continue;/**< 这句话的意思就是左侧和a[i]相同的数字你没有选取,那么显然a[i]也不能选取 */
if(v[i]==0&

最低0.47元/天 解锁文章
1271

被折叠的 条评论
为什么被折叠?



