Project Euler 48

次の式は、1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317 である。
では、1^1 + 2^2 + 3^3 + ... + 1000^1000 の最後の10桁を求めよ。

Mathematica

Total[Table[i^i, {i, 1000}]]

工夫ゼロ。

C/C++

#pragma comment(lib,"mpir.lib")
#include <iostream>
#include <mpir.h>
using namespace std;

// m^n を mpz_t型で返す。
void mpowern(mpz_t *ans, int m, int n){
	mpz_init_set_ui(*ans, 1);

	for(int i=1 ; i<=n ; i++){
		mpz_mul_ui(*ans, *ans, m);
	}
}

int main(){
	mpz_t num, tmp;

	mpz_init_set_ui(num, 0);
	mpz_init_set_ui(tmp, 0);

	for(int i=1 ; i<=1000 ; i++){
		mpowern(&tmp, i, i);
		mpz_add(num, num, tmp);
	}

	mpz_out_str(stdout, 10, num);
}

やっとmpirの扱いに慣れてきたのか、5分ぐらいでできました。