【HDU】3208 Integer’s Power
2012-09-07 16:32
246 查看
题意:定义27的权为3,16的权为4(3^3=27,2^4=16)。求一个区间中所有数的权值之和。
很容易知道[1,n]中有多少个数可以表示成k次方的形式,即n^(1/k)个。
但是,一个数的平方包含了4 6 8 10……次方。
如果知道至多只能表示成k次方的数有多少个,那么就能得到答案了。
可以倒着容斥,如果正的推太复杂了。
另外,pow精度不够,二分答案吧。
很容易知道[1,n]中有多少个数可以表示成k次方的形式,即n^(1/k)个。
但是,一个数的平方包含了4 6 8 10……次方。
如果知道至多只能表示成k次方的数有多少个,那么就能得到答案了。
可以倒着容斥,如果正的推太复杂了。
另外,pow精度不够,二分答案吧。
import java.util.*; import java.math.*; public class Main { static int MAXN = 60; static long Pow(long n, int k) { long low, high, mid, res; low = res = 1; high = n + 1; while (low < high) { mid = (low + high) >> 1; if (BigInteger.valueOf(mid).pow(k).compareTo(BigInteger.valueOf(n)) <= 0) { low = mid + 1; res = mid; } else high = mid; } return res; } 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)); } } }
相关文章推荐
- HDU 3208 - Integer's Power (容斥原理)
- HDU 3208 Integer’s Power
- hdu 3208 Integer’s Power (坑精度,容斥)
- HDU 3208 Integer's Power(容斥原理、指数和、高精度求开根)
- HDU 3208 Integer’s Power
- hdu 3208 Integer’s Power(容斥原理)
- Integer’s Power HDU - 3208 组合数学
- hdu 3208 Integer’s Power 筛法
- Integer’s Power HDU - 3208 组合数学
- Integer’s Power HDU - 3208 组合数学
- Integer’s Power HDU - 3208 组合数学
- Integer’s Power HDU - 3208 组合数学
- HDU 3208 Integer’s Power 【容斥】
- Integer’s Power HDU - 3208 组合数学
- Integer’s Power HDU - 3208 组合数学
- Integer’s Power HDU - 3208 组合数学
- Integer’s Power HDU - 3208 组合数学
- 【HDOJ】3208 Integer’s Power
- hdu 1047 Integer Inquiry(高精度加法)
- HDU 1047 Integer Inquiry -- java大法好