题目描述:
t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数
输入描述:
第一行一个正整数t
之后t行,每行一个正整数n
输出描述:
输出t行,每行一个整数,表示答案
一个书的约数的个数等于把它素因数分解得到的素因数的指数都+1然后累乘。
小的素因数的指数大的话会更优。
now记录现在乘到了多少,ans统计答案,num表示选到了第几个素数
(不过我看到很多题解第16个素数打的是51…不过能A)
#include<iostream>
#include<cstdio>
using namespace std;
long long maxx,n;
int t;
int prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
void dfs(long long now,long long ans,int num,int aha)
{
maxx=max(maxx,ans);
for(int i=1;i<=aha;i++)
{
if(now<=n/prime[num])
{
now*=prime[num];
dfs(now,ans*(i+1),num+1,i);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>t;
while(t--)
{
maxx=0;
cin>>n;
dfs(1,1,0,16);
cout<<maxx<<endl;
}
return 0;
}