题目
链接:https://ac.nowcoder.com/acm/problem/15428
来源:牛客网
题目描述
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
思路
第一想法是1到n的每个数都分解质因数,计算约数个数,但是n<=1000000000000000000太大,无法分解。
题目知识点被标记为dfs和数论,于是往dfs方向想,还是没有思路。
看题解:https://blog.youkuaiyun.com/C_13579/article/details/79767349
假如质因数2的个数为1,2,3,···
假如质因数3的个数为1,2,3,···
dfs遍历每一种可能,计算约数个数,取最大值
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int p[60+1],num=0;
ll n,ans=1;
void prime(int t){
int i;
int f[t+1];
for(i=2;i<t;i++){
f[i] = 1;
}
for(i=2;i<=t;i++){
if(f[i]){
p[++num]=i;
for(int j=i+i;j<t;j+=i){
f[j] = 0;
}
}
}
}
void dfs(int k,ll sum,ll ni,int m){
if(k>17)
return;
ans=max(ans,sum);
for(int i=1;i<=m;i++){
if(ni<=n/p[k]){
ni*=p[k];
dfs(k+1,sum*(i+1),ni,i);
}else
break;
}
}
int main(){
prime(60);
int t;
scanf("%d",&t);
for(int i=0;i<t;i++){
ans=1;
scanf("%lld",&n);
dfs(1,1,1,15);
printf("%lld\n",ans);
}
return 0;
}