bzoj1053 [HAOI2007] 反素数ant

传送门
Description

  对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i)0 < i < x,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么?
Input
  一个数N(1<=N<=2,000,000,000)。
Output
  不超过N的最大的反质数。
Sample Input
1000
Sample Output
840

题解

乍一看这道题很像一道数轮题,于是苦心钻研欧拉函数无果= =
然而这道题跟欧拉函数半毛钱关系都没有,事实上是一道搜索
可以枚举所有的小质数,由于唯一分解定理,若一个数x可以被分解成
               这里写图片描述

这里写图片描述
所以枚举完所有小质数的直属以后就可以直接求其因子数量了
又由于题目要求的是g(x)>g(i) 0 < i < x,所以当因子数量相同时,更小的数才是答案
所以枚举指数的时候较大的质数的指数一定小于等于之前的质数的指数。
搜索即可

#include<cstdio>
int P[13]={0,2,3,5,7,11,13,17,19,23,29,31,37};
int n,maxn;
long long ans;
void dfs(long long num,int tot,int d,int last)
{
    if(tot>maxn||tot==maxn&&num<ans) maxn=tot,ans=num;
    if(d==13) return;
    long long tmp=1;
    for(int i=1;i<=last;i++)
    {
        tmp*=P[d];if(tmp*num>n) break;
        dfs(num*tmp,tot*(i+1),d+1,i);
    }
}
int main()
{
    scanf("%d",&n);
    dfs(1,1,1,27);
    printf("%lld",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值