链接:https://www.nowcoder.com/acm/contest/82/A
来源:牛客网
来源:牛客网
题目描述
t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数
输入描述:
第一行一个正整数t
之后t行,每行一个正整数n
输出描述:
输出t行,每行一个整数,表示答案
对于100%的数据,t <= 500 , 1 <= n <= 1000000000000000000
解题思路:http://acm.bit.edu.cn/mod/programming/view.php?a=534
ACM 求N以内的最大的约数个数。
pos是表示p的下标,val表示的是目前的数值,number表示的是目前最大的约数个数。last是用来优化时间复杂度的,代表的是上一个的约数个数。
AC代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef long long int ll;
int t;
ll ans;
ll ansnumber;
ll a;
int p[19] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,57,59,61 };
void dfs(int pos, ll last,ll val, ll number) //pos是表示p的下标,val表示的是目前的数值,number表示的是目前最大的约数个数。last是用来优化时间复杂度的,代表的是上一个的约数个数。
{
ans = max(ans, number);
if (pos > 18||!last) return;
if (val > a) return;
ll m = 1;
for (ll i = 0; i <= last; i++)
{
if (val > a / m) break;
dfs(pos + 1,i, val*m, number*(i + 1));
m = m*p[pos];
}
return;
}
int main()
{
cin >> t;
while (t--)
{
cin >> a;
ans = 0;
dfs(0,62, 1, 1);
cout << ans << endl;
}
return 0;
}