zoj 2562 反素数

题目大意:求n范围内最大的反素数(反素数定义:f(x)表示x的因子数,f(x)>f(x1) (0<x1<x))

x用质因数形式为:x=a1^p1*a2^p2......an^pn(ai为素数),那么一个数的因子个数f(x)=(p1+1)*(p2+1)*....*(pn+1)

反素数的性质有:x=a1^p1*a2^p2......an^pn,p1>=p2>=......>=pn

证明:若pi<pj(i<j),那么存在与它因子个数相等的x1且x1<x,与反素数的定义矛盾。

前十四个素数每个素数用一次的乘积已经大于10^16,所以枚举前十四个素数就可以了。

#include<iostream>
#include<cstdio>
using namespace std;

typedef long long LL;
int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
LL n,ans,Max;

void dfs(LL sum,LL num,LL k,LL t)
{
    if(sum>Max) {Max=sum;ans=num;}
    if(sum==Max && num<ans) ans=num;
    if(k>14) return ;
    LL temp=num;
    for(int i=1;i<=t;i++)
    {
        if(temp*prime[k]>n) break;
        temp*=prime[k];
        dfs(sum*(i+1),temp,k+1,i);
    }
}

int main()
{
    while(~scanf("%lld",&n))
    {
        ans=n;Max=0;
        dfs(1,1,0,50);
        printf("%lld\n",ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/xiong-/p/3244747.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值