小红构造数组-牛客周赛 Round 29(DFS方法)

题目很直白,方法就是暴力即可。

虽然说数据范围显得很大,但是在长整型范围内,一个数字的素因子数量最多不超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&&a[i]!=pre)
        {
            b[step]=a[i];
            v[i]=1;
            dfs(step+1,a[i]);
            v[i]=0;
        }
    }
}
int main()
{
    long long i;
    cin>>n;
    if(n==1)
    {
        cout<<-1;
        return 0;
    }
    while(n!=1) /**< 找出所有素因子,送入数组a,注意数组a一定是有序的 */
    {
        for(i=2; i*i<=n; i++)
            if(n%i==0)
                break;
        if(i*i>n)
        {
            a[++cnt]=n;
            n=1;
        }
        else
            a[++cnt]=i,n=n/i;
    }
    int len=1,maxs=0;
    for(i=2;i<=n;i++)
    {
        if(a[i]==a[i-1])
            len++;
        else
            len=1;
        maxs=max(len,maxs);
    }
    dfs(1,0);
    if(ok==1)
        cout<<-1;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值