题意:定义27的权为3,16的权为4(3^3=27,2^4=16)。求一个区间中所有数的权值之和。

很容易知道[1,n]中有多少个数可以表示成k次方的形式,即n^(1/k)个。

但是,一个数的平方包含了4 6 8 10……次方。

如果知道至多只能表示成k次方的数有多少个,那么就能得到答案了。

可以倒着容斥,如果正的推太复杂了。

另外,pow精度不够,二分答案吧。

 1 import java.util.*;
 2 import java.math.*;
 3 
 4 public class Main {
 5     static int MAXN = 60;
 6 
 7     static long Pow(long n, int k) {
 8         long low, high, mid, res;
 9         low = res = 1;
10         high = n + 1;
11         while (low < high) {
12             mid = (low + high) >> 1;
13             if (BigInteger.valueOf(mid).pow(k).compareTo(BigInteger.valueOf(n)) <= 0) {
14                 low = mid + 1;
15                 res = mid;
16             } else
17                 high = mid;
18         }
19         return res;
20     }
21 
22     static long Count(long n) {
23         long cnt[] = new long[MAXN];
24         long ans;
25         int i, j;
26         for (i = 0; i < MAXN; i++)
27             cnt[i] = 0;
28         for (i = 1; i < MAXN; i++)
29             cnt[i] = Pow(n, i);
30         ans = 0;
31         for (i = MAXN - 1; i > 0; i--) {
32             for (j = i + i; j < MAXN; j += i)
33                 cnt[i] -= cnt[j];
34             ans += i * cnt[i];
35         }
36         return ans;
37     }
38 
39     public static void main(String[] args) {
40         Scanner in = new Scanner(System.in);
41         long a, b;
42         while (in.hasNext()) {
43             a = in.nextLong();
44             b = in.nextLong();
45             if (a == 0 && b == 0)
46                 break;
47             System.out.println(Count(b) - Count(a - 1));
48         }
49     }
50 }
posted on 2012-09-07 16:32  DrunBee  阅读(451)  评论(0编辑  收藏  举报