bzoj1053: [HAOI2007]反素数ant

太凉了

搜索的练习做不下去了明天再做

先做点数学题压压惊

1~n区间内最约数个数最大中最小的那个数90反素数啊。

然后你可以发现它的指数是由低位到高位递减的。否则交换一下就被淘汰了。

爆搜

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int pr[10]={2,3,5,7,11,13,17,19,23,29};

int li,ymax,mmin;
LL quick_pow(LL d,int p)
{
    LL ret=1;
    while(p>0)
    {
        if(p%2==1)ret*=d;
        d*=d;p/=2;
    }
    return ret;
}
void dfs(int k,int last,LL tot,LL num)
{
    if(num>li)return ;
    if(k==-1)
    {
        if(ymax<tot||(ymax==tot&&mmin>num))
            ymax=tot, mmin=num;
        return ;
    }
    int dsf=li/num,p=0;
    while(dsf!=0)dsf/=pr[k],p++;
    LL mul=quick_pow(pr[k],p);
    for(int i=p;i>=last;i--,mul/=pr[k])
        dfs(k-1,i,tot*(1+i),num*mul);
}
int main()
{
    scanf("%d",&li);
    ymax=0;dfs(9,0,1,1);
    printf("%d\n",mmin);
    return 0;
}

 

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/9289102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值