题目描述
t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数
输入描述:
第一行一个正整数t 之后t行,每行一个正整数n
输出描述:
输出t行,每行一个整数,表示答案
对于100%的数据,t <= 500 , 1 <= n <= 1000000000000000000
思路:
1:直接暴力会超出时间。
2:任何一个数p=质数的乘积;
3:p=x1^n1*x2^n2*x3^n3等等;
4:p的约数是(n1+1)*(n2+1)*(n3+1)*(n4+1)等等
5:质数不需太大,使用前20位即可。
6:用dfs遍历n就行。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
long long prime[21] = { 0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,67,71,73 };
long long int a[25];
int n;
long long int ans;
int sum;
int dfs(int i,long long int k,int p,int q) {
if (i>20)return 0;
int ret = q;
for (int j = 1; j <= p; j++) {
if (ans / k < prime[i])break;
k = k*prime[i];
ret = max(ret, dfs(i + 1, k, j, q*(j + 1)));
}
return ret;
}
int main() {
cin >> n;
while (n-->0) {
cin >> ans;
sum = 1;
memset(a, 0, sizeof(a));
a[0] = 100000;
cout << dfs(1, 1, 64, 1)<< endl;
}
return 0;
}