Live2d Test Env

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\n",ans,num);
    }
    return 0;
}

 

posted @ 2018-06-07 14:35  nimphy  阅读(172)  评论(0编辑  收藏  举报