BZOJ 1053 反素数 题解

空扰寡人 提交于 2019-11-29 03:21:20

题面

引理1:  1~n中的最大反质数,就是1~n中约数个数最多的数中最小的一个(因为要严格保证g(x)>g(i));

引理2:1~n中任何数的不同因子不会超过10个,因为他们的乘积大于2,000,000,000;

引理3:  1~n中任何数的质因子的指数总和不超过30;

引理4:  x的质因子是连续的若干个最小的质数,并且指数单调递减;

 对于指数的排列我们只要深搜就可以找到方案,对于不同情况判断是否更新答案;

#include <bits/stdc++.h>
using namespace std;
long long n;
long long ans=99999999999999;
int a[15]={0,2,3,5,7,11,13,17,19,23,29,31};
inline long long KSM(long long a,long long b)
{
    long long res=1;
    while(b){
        if(b&1) res=res*a;
        a=a*a;
        b/=2;
    }
    return res;
}
long long cnt=-1;
inline void dfs(int dep,int now,long long sum,long long num)
{
    if(sum>n||sum<0){
        return;
    }
    if(num>cnt){
        ans=sum;
        cnt=num;
    }
    else if(num==cnt){
        if(sum<ans) ans=sum;
    }
    if(dep>10){
        return;
    }
    for(register int i=now;i>=1;i--){
        dfs(dep+1,i,sum*KSM(a[dep],i),num*(i+1));
    }
}
int main()
{
    cin>>n;
    dfs(1,32,1,1);
    cout<<ans;
} 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!