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; }
It is your time to fight!