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

Posted huihao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「一本通 6.3 例 1」反素数 Antiprime相关的知识,希望对你有一定的参考价值。

题意:求小于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
",ans);
    cout<<maxx<<endl;
    return 0;
}

 

以上是关于「一本通 6.3 例 1」反素数 Antiprime的主要内容,如果未能解决你的问题,请参考以下文章

「一本通 6.2 例 1」Prime Distance

「一本通 6.3 练习 1」X-factor Chain

「一本通 6.3 练习 2」聪明的燕姿

搜索入门练习题1 素数环 题解

10249「一本通 1.3 例 5」weight

一本通1606 例 1任务安排 1