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 根本不想看,下面纯属乱说。
考虑两份代码唯一的不同点,也就是每次加的
感性理解一下, !p[i])剪掉的也就越多,因为那些大量枚举 p[i]=1 的操作。
当然还有一点大概就是
by Light_az @ 2023-06-19 16:23:25
@liqingyang 这个是倒着搜的结果,这个是正着搜的结果
by dehsirehC @ 2023-06-19 16:38:28
@Light_az 你说得对,但是楼主做的题不是原神,和你玩的东西不大一样