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.
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!! ( )
(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!! ( )[/quote]
Krócej i szybciej :
(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]