51nod1060:最复杂的数(DFS求反素数)

时间:2024-11-05 21:03:20

把一个数的约数个数定义为该数的复杂程度,给出一个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[]={,,,,,,,,,,,,,,}; //
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==) return ;
ll tmp=;
for(int i=;i<=pre;i++){
if(sum<=N/tmp) dfs(pos+,sum*tmp,cnt*(i+),i);
tmp=(ll)tmp*p[pos];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%lld",&N);
ans=num=; dfs(0LL,1LL,1LL,10LL);
printf("%lld %lld\n",ans,num);
}
return ;
}