[BZOJ1053][HAOI2007]反素数ant

1053: [HAOI2007]反素数ant

Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3444  Solved: 2014 [Submit][Status][Discuss]

Description

 

  对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么

Input

  一个数N(1<=N<=2,000,000,000)。

Output

  不超过N的最大的反质数。

Sample Input

1000

Sample Output

840
 
要求的就是范围内最小的那个因数最多的数
对于一个整数$x$,可以唯一分解为 $x=p_{1}^{\alpha_{1}}*p_{2}^{\alpha_{2}}*\cdots*p_{n}^{\alpha_{n}}$ 的形式,其中$p$均为质数
那么它的因数个数为$(\alpha_{1}+1)*(\alpha_{2}+1)*\cdots*(\alpha_{n}+1)$,因为每个质数可以选择$\alpha+1$次,乘法原理
又因为要求的是最小,那么显然$p$是从$2$开始的连续质数,且$\alpha$单调不增,然后搜索即可
#include <iostream>
using namespace std;
typedef long long ll;
ll pri[] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23};
int cnt[10] = {0};
ll n, ans = 2, ansnum;
void work(int w, ll num, ll tot){
    if(w > 9) return;
    if(tot > ans){
        ans = tot;
        ansnum = num;
    }
    if(tot == ans && ansnum > num) ansnum = num;
    ll t = 1;
    for(int i = 1; i <= cnt[w - 1]; i++){
        t *= pri[w];    
        if(num * t > n) return;
        cnt[w] = i;
        work(w + 1, num * t, tot * (i + 1));
    }
}
int main(){
    cin >> n;
    cnt[0] = 31;
    work(1, 1, 1);
    cout << ansnum << endl;
    return 0;
}

 

posted @ 2017-08-29 16:17  jzyy  阅读(187)  评论(0编辑  收藏  举报