51Nod-1060-最复杂的数

来源:互联网 发布:ubuntu ctrl alt f1 编辑:程序博客网 时间:2024/06/05 09:21

ACM模版

描述

描述

题解

百度百科:

对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0 < i < x),都有g(i) < g(x),则称x为反素数。

性质:

No.1 一个反素数的质因子必然是从2开始连续的质数。
No.2 p=2^t1*3^t2*5^t3*7^t4…..必然t1>=t2>=t3>=….

使用反素数原理进行dfs即可。

代码

#include <iostream>typedef long long ll;using namespace std;const int MAXP = 16;const int prime[MAXP] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};ll n, res, ans;void dfs(ll cur, ll num, int key, ll pre)  //  当前值/当前约数数量/当前深度/上一个数{    if (key >= MAXP)    {        return ;    }    else    {        if (num > ans)        {            res = cur;            ans = num;        }        else if (num == ans)    //  如果约数数量相同,则取较小的数        {            res = min(cur, res);        }        ll i;        for ( i = 1; i <= pre; i++)        {            if (cur <= n / prime[key])  //  cur*prime[key]<=n            {                cur *= prime[key];                dfs(cur, num * (i + 1), key + 1, i);            }            else            {                break;            }        }    }}void solve(){    res = 1;    ans = 1;    dfs(1, 1, 0, 15);    cout << res << ' ' << ans << endl;}int main(int argc, const char * argv[]){    int T;    cin >> T;    while (T--)    {        cin >> n;        solve();    }    return 0;}

参考

《反素数》

0 0