巩固-因数最多(一)
题目描述
请找出范围 a ∼ b a\sim b a∼b中因数最多的正整数,如果有多个数的因数并列最多,则选择其中最小的数。
输入格式
输入共 1 1 1行,两个用空格隔开的正整数 a , b a,b a,b。
输出格式
一行,一个整数,为 a ∼ b a\sim b a∼b中因数最多的正整数。如果有多个数的因数并列最多,则选择其中最小的数。
样例 #1
样例输入 #1
3 10
样例输出 #1
6
提示
【样例解释】
3 ∼ 10 3\sim 10 3∼10中, 6 , 8 , 10 6,8,10 6,8,10都有四个因数,分别为 { 1 , 2 , 3 , 6 } , { 1 , 2 , 4 , 8 } , { 1 , 2 , 5 , 10 } \{1,2,3,6\},\{1,2,4,8\},\{1,2,5,10\} {1,2,3,6},{1,2,4,8},{1,2,5,10},并列最多。因此答案为三者中最小的 6 6 6。
【数据说明】
1 ≤ a ≤ b ≤ 100000 1 \le a \le b \le 100000 1≤a≤b≤100000。
答案
#include <iostream>
using namespace std;
typedef long long LL;
LL n, ans, mc;
const int prime[15] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};
void dfs(int u, int m, LL x, LL cnt) {
if (cnt > mc) {
mc = cnt;
ans = x;
} else if (cnt == mc && x < ans) {
ans = x;
}
if (u == 15) return;
for (int i = 1; i <= m; i++) {
x = x * prime[u];
if (x > n) break;
dfs(u + 1, i, x, cnt * (i + 1));
}
}
int main() {
int T;
cin >> T;
while (T--) {
cin >> n;
mc = 0;
dfs(0, 60, 1, 1);
cout << ans << endl;
break;
}
return 0;
}