【容斥+java】 HDU 3208 Integer’s Power

通道

题意:给两个数a和b,然后在[a,b]内的每一个数y都可以表示成x^k=y,要求x尽量最小,k尽量最大,然后求所有的k之和

思路:很容易知道[1,n]中有多少个数可以表示成k次方的形式,即n^(1/k)个,但是,一个数的平方包含了4 6 8 10……次方.如果知道至多只能表示成k次方的数有多少个,那么就能得到答案了

代码:

import java.util.*;
import java.math.*;

public class Main {
    static int MAXN = 60;

    static long Pow(long n, int k) {
        long low, high, mid;
        low = 0;
        high = n + 1;
        while (low + 1 < high) {
            mid = (low + high) >> 1;
            if (BigInteger.valueOf(mid).pow(k).compareTo(BigInteger.valueOf(n)) <= 0) 
                low = mid;
            else high = mid;
        }
        return high;
    }
    static long Count(long n) {
        long cnt[] = new long[MAXN];
        long ans;
        int i, j;
        for (i = 0; i < MAXN; i++)
            cnt[i] = 0;
        for (i = 1; i < MAXN; i++)
            cnt[i] = Pow(n, i);
        ans = 0;
        for (i = MAXN - 1; i > 0; i--) {
            for (j = i + i; j < MAXN; j += i)
                cnt[i] -= cnt[j];
            ans += i * cnt[i];
        }
        return ans;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long a, b;
        while (in.hasNext()) {
            a = in.nextLong();
            b = in.nextLong();
            if (a == 0 && b == 0)
                break;
            System.out.println(Count(b) - Count(a - 1));
        }
    }
}
View Code

 

posted @ 2015-08-19 20:14  mithrilhan  阅读(183)  评论(0编辑  收藏  举报