反素數

參考了Acmdreamers的博客
反素數的定義:
對於任何正整數n,其約數個數記爲f(n)。
如果某個正整數n滿足:對任意的正整數i(0<i<n) ,都有f(i)<f(n) ,那麼稱n爲反素數。
爲了保證有n個約數的這個數儘量小,所有質因子必然是從2開始的連續若干個質數,並且因子的個數遞減。
應用
1. 給定一個數n,求一個最小的正整數x,使得的x約數個數爲n
2. 求出1~n中約數個數最多的這個數

主要使用dfs來計算x
下面是一道例題CodeForces27E

#include<iostream>
using namespace std;

int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
unsigned long long n,ans;
void dfs(int dep,unsigned long long temp,int num)
{
    //cout<<dep<<' '<<temp<<' '<<num<<endl;
    if(num > n) return;
    if(num == n)
    {
        if(temp < ans)
            ans = temp;
        return;
    }
    for(int i = 1;i<=63;i++)
    {
        if(temp*p[dep]>ans)
            break;
        temp*= p[dep];
        //cout<<temp<<endl;
        dfs(dep+1,temp,num*(i+1));
    }
}
int main()
{
    cin>>n;
    ans = 0x3f3f3f3f3f3f3f3f;
    dfs(0,1,1);
    cout<<ans<<endl;
}
發佈了35 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章