反素数打表

转自链接:https://www.cnblogs.com/12mango/p/7592925.html

本数学渣渣终于也涉及到一些数论问题了QAQ

反素数:

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
一些性质:

  反素数性质一:一个反素数的质因子必然是从2开始的连续的质数
  反素数性质二:N=p1^e1 * p2^e2 ...... pr^er,必然有e1>=e2>=... >=er,而一个数的因子数=(e1+1)*(e2+1)*(e3+1)...(er+1)


下面是剪枝打表:
/*
36的因子
1 2 3 4 6 9 12 18 36
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
#define inf 1<<29
int n,p[]={0,2,3,5,7,11,13,17,19,23,29,31},use[20];
ll maxt,ans;//maxt是最大因子数,ans是当前的反质数
//id是素数表的下标,now是当前数字,tot是因子数,符合因子数公式
void dfs(ll id,ll now,ll tot){
    if(tot>maxt)//找到了因子数更大的数
        ans=now,maxt=tot;
    else if(tot==maxt && now<ans)//找到因子数相同,但是数值更小的数
        ans=now,maxt=tot;
    use[id]=0;
    while(now*p[id]<=n && use[id]+1<=use[id-1]){//第二个是剪枝
        use[id]++;
        now*=p[id];
        dfs(id+1,now,tot*(use[id]+1));
    }
}
int main(){
    scanf("%d",&n);
    use[0]=inf;
    dfs(1,1,1);
    printf("%lld",ans);
    return 0;
}

 

posted on 2018-10-31 19:34  zsben  阅读(496)  评论(0编辑  收藏  举报

导航