Problem 48

Problem 48

The series, 1^1 + 2^2 + 3^3 + … + 10^10 = 10405071317.

Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + … + 1000^1000.

(1..1000).collect{|i| i**i}.inject(:+).to_s.slice(-10..-1)
p (1..1000).map{|e| e**e}.inject(:+).to_s[-10, 10]

krocej!! ( :stuck_out_tongue: )

(1..1000).map{|e| e**e}.inject(:+) % 10**10

zastanawiam się, czy

(1..1000).map{|e| e**e % 10**10}.inject(:+) % 10**10

nie byłoby szybsze, ale chyba nie, bo w końcu dzielenie jest wolniejsze od sumowania.

[quote=teamon]p (1..1000).map{|e| e**e}.inject(:+).to_s[-10, 10]
krocej!! ( :stuck_out_tongue: )[/quote]
Krócej i szybciej :slight_smile: :

(1..1000).reduce {|s,n| s+n**n} % 10**10
p (1..1000).map {|x| x**x}.inject {|sum,n| sum + n}.to_s.slice(-10..-1)

Eh, a ja sobie utrudniłem zadanie, korzystając z algorytmu szybkiego potęgowania + modułowanie cały czas. Powinno działać szybciej, zabierać mniej pamięci bla bla bla.

[code=ruby]class Fixnum

def pow_with_mod(k, p)
return 1 if k == 0

dane = self.pow_with_mod(k/2, p)

if (k % 2 == 0)
  (dane*dane) % p
else
  (self*(dane*dane)) % p
end

end

end

sum = 0
p = 100000000000

1.upto(1000) do |n|
sum += n.pow_with_mod(n, p)
end

puts sum.to_s[-10,10][/code]