这是TopCoder SRM283的一道题目,属于数论的范畴。如果使用算法不适合,会出现超时。算法如下:
ret = 1;
for(int p = 2;(long long )p*p<=b; p++){
if(b%p==0){//p is prime factor of b
k = 0;
//calculate k that p^k is factor of b and p^(k+1) is not
while(b%p==0){
b = (int)(b/p);
k++;
}
c = (long long )(a/p);
h = 0;
int temp = p;
//judge if p^k is factor of a, if not , calculate h that
//p^h is factor of a, and p^(h+1) is not
while(a>=temp){
h += int(a/temp);
temp = temp*p;
if(h>k) break;
}
ret = ret*(int)pow(p*1.0,double(MIN(k,h)));
}
}
if(a>=b) ret = ret*b;
return ret;
ret = 1;
for(int p = 2;(long long )p*p<=b; p++){
if(b%p==0){//p is prime factor of b
k = 0;
//calculate k that p^k is factor of b and p^(k+1) is not
while(b%p==0){
b = (int)(b/p);
k++;
}
c = (long long )(a/p);
h = 0;
int temp = p;
//judge if p^k is factor of a, if not , calculate h that
//p^h is factor of a, and p^(h+1) is not
while(a>=temp){
h += int(a/temp);
temp = temp*p;
if(h>k) break;
}
ret = ret*(int)pow(p*1.0,double(MIN(k,h)));
}
}
if(a>=b) ret = ret*b;
return ret;
这是一篇关于TopCoder SRM283中数论问题的解决方案,主要探讨如何高效地计算a的阶乘与b的最大公约数。为了避免超时,文章提出了一种算法,通过遍历质数p并找到其作为b因子的幂次k,以及判断p的幂次是否为a的因子,最后将结果相乘。在循环结束后,如果a大于等于b,则将b乘以结果。
2206

被折叠的 条评论
为什么被折叠?



