【发布时间】:2015-07-28 12:35:48
【问题描述】:
我正在寻找一种有效的算法来解决以下问题。让d(n) 表示n 的正除数的数量,其中n 是正整数。我们得到了一些1 <= a <= b <= 10^18,任务是在[a..b] 段上找到d 的最大值,并且(可能我们需要为此部分更复杂的算法)找到使d 的值最大化的数字。
前段时间在免费访问中发现如下代码:http://ideone.com/qvxPj
unsigned long long n, res;
int p, primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 51, 53, 59, 61, 67, 71};
unsigned long long mul(unsigned long long a, unsigned long long b){
unsigned long long res = 0;
while (b){
if (b & 1LL) res = (res + a);
if (res >= n) return 0;
a = (a << 1LL);
b >>= 1LL;
}
return res;
}
void backtrack(int i, int lim, unsigned long long val, unsigned long long r){
if (r > res) res = r;
if (i == p) return;
int d;
unsigned long long x = val;
for (d = 1; d <= lim; d++){
x = mul(x, primes[i]);
if (x == 0) return;
backtrack(i + 1, d, x, r * (d + 1));
}
}
int main(){
p = sizeof(primes) / sizeof(int);
while (scanf("%llu", &n) != EOF){
res = 0;
backtrack(0, 100, 1, 1);
printf("Maximum number of divisors of any number less than %llu = %llu\n", n, res);
}
return 0;
}
如果有人向我解释它是如何工作的,我会非常高兴,因为(就我而言)这个程序运行得非常快。
提前感谢您的帮助。
【问题讨论】:
-
请修复代码环境:在
mul函数前添加一个空行。 -
你是否考虑不同的除数?除数需要简单吗?例如,
d(12)是什么? -
我考虑所有除数,所以 d(1) = 1, d(prime) = 2, d(12) = 6
标签: c++ algorithm numbers number-theory