AcWing 198. 反素数(y总字幕版,思路贼清晰)
原题链接
中等
作者:
Elegant
,
2021-04-13 19:41:57
,
所有人可见
,
阅读 4740
每一步操作都有y总的原话讲解哦!!思路相当清晰~~
#include<iostream>
#include<cstring>
// #include<cstdio>由于这个题目的读入量很小,所以我们完全可以用cin来读
#include<algorithm>
using namespace std;
int primes[9]={2,3,5,7,11,13,17,19,23};//primes的话一共是有9个对吧
typedef long long LL;//当然这里要加一个long long 啊
int maxd;//比方说我们的约数个数可以记为我们的maxd
int number;//然后数本身的话可以记成number
int n;//然后还有一个n对吧,这是我们读入的这个数
void dfs(int u,int last,int p,int s)//好,那我们dfs一下,上一个的次数,上一个数,以及我们的约数个数
{
//好,然后如果我们当前的约数个数是大于我们的最大约数个数了
//或者是等于等于最大约数个数并且p小于number的话
if(s>maxd||s==maxd&&p<number)
{
maxd=s;//我们就要更新一下
number=p;//然后number等于p,对吧
}
//好,接下来的话就去枚举一下啊
//当然这里我们要判断一下啊,如果u已经的等于9了,表示已经枚举了所有情况了,那么我们就可以直接return了
if(u==9)return;
//然后接下来去枚举一下次数
//次数的话咱们从一次开始枚举,一直枚举到第,last次对吧,不能比上一次多
for(int i=1;i<=last;i++)
{
if((LL)p*primes[u]>n)//那每次都先算一下我们这个这个,p乘上一个我们当前的质数,看一下是不是已经大于n了
break;//大于n的话那就直接break就可以了对吧
//好,然后否则的的话,咱们就让p就乘上一个primes[u]
p*=primes[u];
//好然后再dfs下一次
dfs(u+1,i,p,s*(i+1));//u+1,然后是这个i,对吧,p,还有这个s*(i+1);
//好,然后我们来调试一下
}
}
int main()
{
cin>>n;
/*字 幕 开 始*/
//首先dfs一遍
//那么dfs里面是有几个参数呢?
//第一个是我们枚举到第几个质数了,第0个对吧,从第0个开始枚举
//然后下一个的话是我们的次数最大是多少对吧,那我们刚刚说了次数最大是30对吧,当前最大次数是30
//然后我们这个数本身乘积是多少?这个乘积本身是1对吧
//好,然后...(y总摸了摸鼻子和嘴唇继续说)呃...下一个,下一个应该是约数个数对吧,约数个数的话最开始是1对吧
//因为我们约数个数是通过公式来算的,每次都要乘上一个数,所以在没乘之前应该是1
dfs(0,30,1,1);
//哦,忘记输出了咱们,咱们要把这个答案输出
cout<<number<<endl;
//好,840对吧,没问题
return 0;
}
码字不易,点个赞再走呗~~
(y总摸了摸鼻子和嘴唇继续说)
让我的脑海中立刻浮现出视频中的画面
这种优质题解再来一打。
联想练习器
$好,然后…(y总摸了摸鼻子和嘴唇继续说)$
$哦,忘记输出了咱们,咱们要把这个答案输出$
$好,840对吧,没问题$
再现原版$y总$
%lcy
为什么你也可以放视频[doge]
请问佬,18的时候答案不应该是18吗,为什么代码输出的结果是12呢
“你能求出不超过 N 的最大的反质数么?”
人才
@lcy
wocao
好家伙,极草
大佬,请问一下dfs(u+1,i,p,s*(i+1))后为什么不用恢复现场
每个质因子对应的位置是固定的,下一次回溯到这一步的时候直接覆盖上一次的值
牛逼啊,哥们
逆天
关于一篇题解成功唤起了我丧失已久的想象力这件事
有一个问题想请教一下大佬,为什么dfs里面for循环那里是正序循环,可不可以倒序循环,质因子次数是递减的呀
$Q$:为什么在$dfs$中循环是从小到大的,而不是从大到小的,从大到小不行吗?
$A$:也可以,但复杂的多,不推荐:
总结
由小到大:
(1)简单乘积即可,不用初始化一个极大的可能爆long long 的幂次结果.
(2)方便剪枝,不行了就不再计算。
由大到小:
(1)需要初始化一个极大的幂次结果,不管有用没用,得先算出来,等着挨除。
(2)无法剪枝,剪枝了后面就没法算了,只能是判断不新派发任务。
%汪佬
%
不用到29吗?
每个质因子我们都只乘的一次幂,要是算上29就会超过2e9数据范围,故1-2e9中的数不可能存在29这个质因子
直接狂点赞
p=primes[u];
//好然后再dfs下一次
dfs(u+1,i,p,s(i+1));//u+1,然后是这个i,对吧,p,还有这个s(i+1);
这里为什么写成
p=primes[u];s*=(i+1);
//好然后再dfs下一次
dfs(u+1,i,p,s);就不对了
你多乘了。(i+1)是对于当前这个质数的幂次为i,
如果你先算出来就变成了(1+1)(2+1).....和约数个数公式就不一样了
或者你可以先算出来,在再dfs完后回溯
s*=(i+1)
dfs()
s/=(i+1)