BZOJ1053: [HAOI2007]反素数ant(唯一分解定理的应用)

题意:传送门
题解:首先,要考虑 1   N 1~N 1 N中最大的反质数,就是 1   N 1~N 1 N中约数个数最多的数中最小的一个。
这点是必然的,其次,在 1   N 1~N 1 N任何数的不同质因子都不会超过 10 10 10个,且所有质因子的指数总和都不会超过 30 30 30,最小的11个质数的乘积 2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 ∗ 19 ∗ 23 ∗ 29 ∗ 31 > 2 ∗ 1 0 9 2*3*5*7*11*13*17*19*23*29*31>2*10^{9} 235711131719232931>2109,所以 N N N中的任何一个数都不可能有多于 10 10 10个不同的质因子。即使只包含最小的质数,仍然是 2 31 > 2 ∗ 1 0 9 2^{31}>2*10^9 231>2109,所以指数总和不可能超过30。最后, x x x的质因子是连续的若干个最小的质数,并且指数非严格单调递减。因为首先不连续的话,可以将后面大的质因子转为前面某个不存在的质因子以及它的指数,对于指数非严格单调递减,也是可以将后面指数大的与前面指数小的互相调换答案不是更优,所以可以直接调用搜索来做。
c o d e : code: code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,ps[]={2,3,5,7,11,13,17,19,23,29,31},minx,sum;
void dfs(int u,int last,int p,int s)
{
    if(s>sum||s==sum&&p<minx){
        minx=p;sum=s;
    }
    for(int i=1;i<=last;i++){
        if((ll)p*ps[u]>n)break;
        p*=ps[u];
        dfs(u+1,i,p,s*(i+1));
    }
}
int main()
{
    cin>>n;
    dfs(0,30,1,1);
    cout<<minx<<endl;
    return 0;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值