码迷,mamicode.com
首页 > 其他好文 > 详细

「一本通 6.3 例 1」反素数 Antiprime

时间:2019-10-27 01:08:52      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:cout   分解   ret   ==   code   ant   style   nbsp   printf   

题意:求小于n的约数最多的正整数.

由唯一分解定理得一个数$ x=p_1^{a_1}p_2^{a_2}...p_n^{a_n}(p_1<p_2<.....<p_n) $

则他的约数个数为$ (a_1+1)(a_2+1)...(a_n+1). $

若x是反素数,则 $a_1>=a_2>=a_3.....>=a_n$,随便调换两个数的位置得到的都是更差的解.

这样的话降序搜索就行了.且质因子最多为10个.

时间复杂度我不会证QWQ

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,ans,maxx=0;
LL a[20]={0,2,3,5,7,11,13,17,19,23,29};
void dfs(int id,int p,LL x,LL y){
    if(y>maxx){ maxx=y; ans=x;}
    if(y==maxx&&ans>x) ans=x;
    if(id==11) return;
    LL tmp=1;
    for(int i=1;i<=p;++i){
        tmp*=a[id];
        if(x*tmp>n) break;
        dfs(id+1,i,x*tmp,y*(i+1));
    }
} 
int main(){
    scanf("%lld",&n);
    dfs(1,31,1,1);
    printf("%lld\n",ans);
    cout<<maxx<<endl;
    return 0;
}

 

「一本通 6.3 例 1」反素数 Antiprime

标签:cout   分解   ret   ==   code   ant   style   nbsp   printf   

原文地址:https://www.cnblogs.com/huihao/p/11746334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!