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,会将一部分值本身多计算一次
因此最后要做一点修整
1
import
java.util.
*
;
2 import java.util.regex. * ;
3 import java.text. * ;
4 import java.math. * ;
5 import java.awt.geom. * ;
6
7 public 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)/i - (a-1)/i;
14 for(i = 2 ; i <= (a+b)/2; ++ i){
15 int k = pow(i,n);
16 sum -= (a+b)/k - (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}
2 import java.util.regex. * ;
3 import java.text. * ;
4 import java.math. * ;
5 import java.awt.geom. * ;
6
7 public 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)/i - (a-1)/i;
14 for(i = 2 ; i <= (a+b)/2; ++ i){
15 int k = pow(i,n);
16 sum -= (a+b)/k - (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}