• [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;
    }
  • 相关阅读:
    从键盘输入10个数,计算出正数和负数的个数。
    浏览器允许的并发请求资源数 优化
    strict 严格模式
    AMD 和 CMD 的区别
    Canvas
    visual filters 滤镜 ie
    ie 如何判断正在执行的脚本
    async
    富文本编辑器
    检测CSS属性 是否支持
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7448739.html
Copyright © 2020-2023  润新知