2018.09.07【COGS693】Antiprime數 (唯一分解)

傳送門


解析:

以後再說。。。。


代碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
#define st static

inline
ll getint(){
    re ll num=0;
    re char ch=gc();
    while(!isdigit(ch))ch=gc();
    while(isdigit(ch))num=(num<<1)+(num<<3)+(ch^48),ch=gc();
    return num;
}

bool mark[50002];
int prime[50002],pcnt;

inline
void linear_sieves(int len=50000){
    mark[1]=true;
    for(int re i=2;i<=len;++i){
        if(!mark[i])prime[++pcnt]=i;
        for(int re j=1;j<=pcnt&&i*prime[j]<=len;++j){
            mark[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}

int ans,maxn;
ll n;

inline
void dfs(ll num,ll tot,int pos,int up){
    if(maxn<tot||(maxn==tot&&num<ans)){
        ans=num;
        maxn=tot;
    }
    if(pos>pcnt)return ;
    for(int re i=1;i<=up;++i){
        num*=prime[pos];
        if(num>n)return ;
        dfs(num,tot*(i+1),pos+1,i);
    }
}


signed main(){
    freopen("antip.in","r",stdin);
    freopen("antip.out","w",stdout);
    n=getint();
    linear_sieves(min(n,(ll)50000));
    dfs(1,1,1,500);
    cout<<ans<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章