题目描述:
t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数
输入描述:
第一行一个正整数t 之后t行,每行一个正整数n
输出描述:
输出t行,每行一个整数,表示答案
示例1
输入
复制
5 13 9 1 13 16
输出
复制
6 4 1 6 6
备注:
对于100%的数据,t <= 500 , 1 <= n <= 1000000000000000000
思路:
官方题解:
意思就是搜索呗,质因数越小越好,那么我们就暴力搜,控制每个质数的次方为k,且得到的数<=n,那么乘下一个质数的时候,他的因子,一定要小于k,这样会剪了不少枝
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int pri[100]={2,3,5,7,11,13,17,19,23,29,31,37,41,43};
ll ans,n;
ll dfs(ll num,int pos,int k,int sum){//k表示当前乘了该素数的几次方,下一个数的次方不能超过它
if(pos>12)return 0;
ll ans=sum;
for(int i=1;num<=n/pri[pos]&&i<=k;i++){//针对一个素数,求num乘它的x次方,且小于n
// n/pri[pos]不用乘,防爆
num*=pri[pos];
ans=max(ans,dfs(num,pos+1,i,sum*(i+1)));
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
printf("%lld\n",dfs(1,0,64,1));
}
}