• 1060 最复杂的数(反素数玄学dfs)


    题目来源: Ural 1748
    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
    把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。
     
    例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的。
    Input
    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 100)
    第2 - T + 1行:T个数,表示需要计算的n。(1 <= n <= 10^18)
    Output
    共T行,每行2个数用空格分开,第1个数是答案,第2个数是约数的数量。
    Input示例
    5
    1
    10
    100
    1000
    10000
    Output示例
    1 1
    6 4
    60 12
    840 32
    7560 64
     
     
     
    //就是求,小于等于 n 的反素数,外链走一波-反素数深度分析,很好理解
    解法就是dfs走一波,可以剪枝,较小的素数的指数>=较大的素数的指数
    但是这复杂度感觉上还是挺高的,算不清楚。。。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define INF 0x3f3f3f3f
     4 #define eps 1e-9
     5 #define LL long long
     6 #define MX 10005
     7 
     8 const int prim[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
     9 
    10 LL n;
    11 LL big, num;
    12 
    13 void dfs(int step, LL sz, LL yue, int mmm)
    14 {
    15     if (step>=16) return;
    16     if (yue>big)
    17     {
    18         big = yue;
    19         num = sz;
    20     }
    21     if (yue==big&&sz<num)
    22         num = sz;
    23     for (int i=1;i<=63;i++)
    24     {
    25         if (n/sz>=prim[step]&&i<=mmm)
    26             dfs(step+1,sz*=prim[step],yue*(i+1),i);
    27         else break;
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     int T;
    34     scanf("%d",&T);
    35     while(T--)
    36     {
    37         scanf("%lld",&n);
    38         big=0;
    39         dfs(0,1,1,64);
    40         printf("%lld %lld
    ",num,big);
    41     }
    42     return 0;
    43 }
    View Code
     
  • 相关阅读:
    2019年金秋第八周助教小结
    2019年金秋第七周助教小结
    2019年金秋第五周助教小结
    2019年金秋第四周助教小结
    2019年金秋第三周助教小结
    Java实验报告(一)
    L1-049 天梯赛座位分配 (20 分)
    助教个人总结
    【CF603E】Pastoral Oddities
    机房人物列传
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/7623552.html
Copyright © 2020-2023  润新知