求问深搜

学术版

Dream__Sky @ 2023-06-18 18:52:52

题目:

Alien 的思想真的很诡异。 对于一个 1..N 的排列,Alien 们会把它们全部+1,变成 2..N+1 的 Alien 排列,然后考虑这个排列的优美程度。我们称 Alien 排列的第 i 个数为 Ai,一个排列的是优美的当且仅当对于 i=1..N,i 可以整除 Ai。

现在 Alien 给出一个 N,请你求一下 N 长度的优美排列个数。

Input

一行一个数 N,表示长度为 N。

Output

一行一个数 Ret,表示优美排列个数。

Samples

输入数据

5

输出数据

3

数据范围:

对于 30%数据 N≤10

对于 100%数据 N≤3000

两份代码:

#include <bits/stdc++.h>
using namespace std;
int n,daan;
bool p[3001];

void dfs(int dep)
{
    if(dep>n)
    {
        daan++; 
        return ;
    }
    for(int i=max(dep,2);i<=n+1;i+=dep)
    {
        if(!p[i])
        {
            p[i]=1;
            dfs(dep+1);
            p[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    dfs(1);
    cout<<daan;
    return 0;
}
//从小到大搜索TLE了
#include <bits/stdc++.h>
using namespace std;
int n,daan;
bool p[3001];

void dfs(int dep)
{
    if(dep==0)
    {
        daan++; 
        return ;
    }
    for(int i=max(2,dep);i<=n+1;i+=dep)
    {
        if(!p[i])
        {
            p[i]=1;
            dfs(dep-1);
            p[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    dfs(n);
    cout<<daan;
    return 0;
}
//从大到小搜索为什么就能过??

没有用 latex,见谅


by Light_az @ 2023-06-18 18:56:46

@Dream__Sky 不排除数据问题吧,有些搜索因为数据问题倒着搜就过了


by Dream__Sky @ 2023-06-18 19:01:23

@Light_az 这么玄学吗,那能不能判断哪些要倒着搜,哪些不用


by dehsirehC @ 2023-06-18 19:51:45

@Light_az ?


by dehsirehC @ 2023-06-18 19:56:46

@Dream__Sky 题目没 latex 根本不想看,下面纯属乱说。

考虑两份代码唯一的不同点,也就是每次加的 dep 不一样。

感性理解一下, dep 越大这个 i 的循环次数就会越少,能剪枝(!p[i])剪掉的也就越多,因为那些大量枚举 i 的 dep 都已经经过了很多次 p[i]=1 的操作。

当然还有一点大概就是 dep 越大 i 越大,对前面的剪枝效果也会更加明显。


by Light_az @ 2023-06-19 16:23:25

@liqingyang 这个是倒着搜的结果,这个是正着搜的结果


by dehsirehC @ 2023-06-19 16:38:28

@Light_az 你说得对,但是楼主做的题不是原神,和你玩的东西不大一样


|