链接: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; }