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
3
4
5
6
7
8

9
10

11
12
13
14

15
16
17
18

19
20
21
22
23
24
25
26

27
28
29

30
31
32
33
34
35
36
37