ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LDU反素数

2022-01-21 23:58:00  阅读:128  来源: 互联网

标签:temp int 因子 素数 num LDU dp


反素数

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的最大的反素数。
Samples
Input
1000
Output
840

本题就是反素数经常考的一种类型给定n,求n以内因子数最多的数。
一提到因子数,首先想到的就是把素因子分解。把n分解成
n=(p1的k1次方)*(p2的k2次方)**(p3的k3次方)……

那么因子总数 ans=(k1+1)(k2+1)(k3+1)……

但是我们要枚举到多少次幂呢?(好问题)
考虑极端情况,n是某一个素数的k次幂,long long 为2的64次幂,所以我们最多就考虑到64层!!!(emmm)
那什么时候停止呢?
1.当前因子大于我们想要的因子或正好为我们想要的因子
2.已经大于n

下面是已经AC的代码``

ll primes[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int maxd,maxval;
long long n;
//dp 为当前枚举第几个素数。 num为当前因子的数量
//temp为当前因子数位num的数值。up为上一个素数的幂,这次应该小于等于这个幂次
void dfs(int dp,ll temp,int num,int up)
{
    if((num>maxd)||(num==maxd&&maxval>temp)){
    //当前因子数>maxd or 因子数相同,取值小的
        maxd=num;
        maxval=temp;
    }
    if(dp==16) return;
    for(int i=1;i<=up;i++){
        if(primes[dp]*temp>n) break;
        temp*=primes[dp];
        dfs(dp+1,temp,num*(i+1),i);
    }
}
int main()
{
    cin>>n;
    dfs(0,1,1,60);
    cout<<maxval<<endl;
}

标签:temp,int,因子,素数,num,LDU,dp
来源: https://blog.csdn.net/qq_51761458/article/details/122631349

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有