zoukankan      html  css  js  c++  java
  • 51nod1060:最复杂的数(DFS求反素数)

    把一个数的约数个数定义为该数的复杂程度,给出一个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个数是约数的数量。Sample Input

    5
    1
    10
    100
    1000
    10000

    Sample Output

    1 1
    6 4
    60 12
    840 32
    7560 64

    题意:给定N,求小于等于N的因子最多的数。

    思路:DFS即可。减枝就是,越小的数个数肯定比大的数多。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,47,51}; //15
    ll ans,num,N;
    void dfs(int pos,ll sum,ll cnt,int pre)
    {
        if(cnt<=num&&sum>ans) return ;
        if(cnt>num||(num==cnt&&sum<ans)) {ans=sum;num=cnt;}
        if(pos==15) return ;
        ll tmp=1;
        for(int i=0;i<=pre;i++){
            if(sum<=N/tmp) dfs(pos+1,sum*tmp,cnt*(i+1),i);
            tmp=(ll)tmp*p[pos];
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%lld",&N);
            ans=num=0; dfs(0LL,1LL,1LL,10LL);
            printf("%lld %lld
    ",ans,num);
        }
        return 0;
    }
  • 相关阅读:
    2019 SDN上机第2次作业
    2019 SDN上机第1次作业
    第07组 团队Git现场编程实战
    第二次结对编程作业
    c语言之问题集
    2019春第2次课程设计实验安排
    2019年十二周总结
    第十一周总结
    第十周作业
    第九周总结
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9150461.html
Copyright © 2011-2022 走看看