zoj 2562(反素数)

对于任何正整数x,记约数的个数记做g(x).例如g(1)=1,g(6)=4.

如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

性质一:一个反素数的质因子必然是从2开始连续的质数.

性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

#include <cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long prim[14]={2,3,5,7,11,13,17,19,23,29,31,37,41,43};
long long ans,ans_sum,n;
void back_prim(long long cnum,long long csum,long long k,long long limit){
    if(cnum>n) return ;
    else if(csum>ans_sum) ans=cnum,ans_sum=csum;
    else if(csum==ans_sum && cnum<ans) ans=cnum;
    long long p=prim[k];
    for(int i=1;i<=limit;i++,p*=prim[k]){
        if(cnum*p>n) break;
        else back_prim(cnum*p,csum*(i+1),k+1,i);
    }
}
int main(int argc, char** argv) {
    while(scanf("%lld",&n)!=-1){
        ans=1,ans_sum=1;
        back_prim(1LL,1LL,0,50);
        printf("%lld\n",ans);
    }
    return 0;
}


你可能感兴趣的:(zoj 2562(反素数))