第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 100) 第2 - T + 1行:T个数,表示需要计算的n。(1 <= n <= 10^18)
共T行,每行2个数用空格分开,第1个数是答案,第2个数是约数的数量。
5 1 10 100 1000 10000
1 1 6 4 60 12 840 32 7560 64
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <string> #include <functional> #include <cmath> #include <set> #include <queue> #include <algorithm> #include <vector> #include <map> #include <stack> using namespace std; #define esp 1e-8 const double PI = acos(-1.0); const double e = 2.718281828459; const int inf = 2147483647; const long long mod = 1000000007; //freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取 //freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中cin typedef long long ll; long long a[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59}; long long ans, res; long long n, b[20], c[20]; void dfs(ll cur, ll num, int dept, int pre)//当前值,当前约数的数量,当前的深度,上一个的个数 { /*if (dept > 15) return;*/ // else { if (num > ans) { ans = num; res = cur; } else if (num == ans) { res = min(res, cur); } ll i; for (i = 1; i <= pre; ++i) { if (cur <= n / a[dept]) { cur = cur * a[dept]; dfs(cur, num * (i + 1), dept + 1, i); } else break; } } } int main() { int t, i, j; scanf("%d", &t); while (t--) { scanf("%lld", &n); long long s = 0; res = 1; ans = 1; dfs(1, 1, 0, 63); printf("%lld %lld\n", res, ans); } }