您的位置:首页 > 其它

【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精度不够,二分答案吧。

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));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: