Problem 48
Self powers
The series, 11 + 22 + 33 + … + 1010 = 10405071317.
Find the last ten digits of the series, 11 + 22 + 33 + … + 10001000.
自幂
十项的自幂级数求和为 11 + 22 + 33 + … + 1010 = 10405071317。
求如下一千项的自幂级数求和的最后10位数字:11 + 22 + 33 + … + 10001000。
@Test
public void test(){
System.out.println(Calculator.calculate(10, 1000));
}
public static class Calculator {
public static Long calculate(int lastBitLen, int upLimit) {
int [] sum = new int[lastBitLen];
for( int i = 1; i <= upLimit; i ++){
int [] a = calculateArr(i, lastBitLen);
sum = sumArr(a, sum);
}
return arr2Long(sum);
}
private static Long arr2Long(int[] sum) {
Long val = 1L * sum[0];
for( int i = 1; i < sum.length; i ++){
val = val * 10 + sum[i];
}
return val;
}
private static int[] calculateArr(int n, int lastBitLen) {
int [] sum = new int[lastBitLen];
sum[ lastBitLen - 1] = n;
for( int i = 0; i < n - 1; i ++){
for( int j = 0; j < lastBitLen; j ++){
sum[j] *= n;
}
for( int j = lastBitLen - 1; j > 0; j --){
sum[j - 1] += sum[j] / 10;
sum[j] %= 10;
}
sum[0] %= 10;
}
return sum;
}
private static int[] copyArrs(int[] b) {
return Arrays.copyOf(b, b.length);
}
private static int[] sumArr(int[] a, int[] b) {
int[] ret = copyArrs(b);
for (int i = 0; i < a.length; i++) {
ret[i] += a[i];
}
for (int i = b.length - 1; i > 0; i--) {
ret[i - 1] += (ret[i] / 10);
ret[i] = ret[i] % 10;
}
ret[0] = ret[0] % 10;
return ret;
}
}