TopCoder SRM 394 Level2 1000
http://www.topcoder.com/stat?c=problem_statement&pm=8547&rd=11128
求a到a+b所有的数的cool divider数量之和,即本身能被整除但是其n次方不能被整除

由于数据高达10^7,暴力没有可能,将乘法转化为加法也仍然计算量太大
答案给出了很好的解决方法
对于a到a+b中间的数,可以整除i的个数为(a+b)/i - (a-1)/i,以上均为int的除法操作
这样大大节省了计算量
唯一要注意的是如果b大于a,会将一部分值本身多计算一次
因此最后要做一点修整

 

 1import java.util.*;
 2import java.util.regex.*;
 3import java.text.*;
 4import java.math.*;
 5import java.awt.geom.*;
 6
 7public class ProperDivisors
 8{
 9    public int analyzeInterval(int a, int b, int n)
10    {
11        int i,sum = 0;
12        for(i = 2 ; i <= (a+b)/2++ i)
13            sum += (a+b)/- (a-1)/i;
14        for(i = 2 ; i <= (a+b)/2++ i){
15            int k = pow(i,n);
16            sum -= (a+b)/- (a-1)/k;
17        }

18        if(b >= a){
19            sum -= (a+b)/2 - a + 1;
20            if(a == 1) sum++;
21        }

22        
23        return sum;
24    }

25    
26    public int pow(int k, int n){
27        int i;
28        long result = k;
29        for( i = 1 ; i < n; ++ i){
30            result *= k;
31            if(result > Integer.MAX_VALUE)
32                return Integer.MAX_VALUE;
33        }

34        int res = (int)result;
35        return res;
36    }

37}