【容斥+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)); } } }