Integer # pow est recommandé pour résoudre à plusieurs reprises la méthode du carré dans Ruby

introduction

Le début des choses

Dans Ruby, il existe une méthode dédiée Integer # pow.

Je l'ai essayé immédiatement. AtCoder Typical Contest 002 B - n^p mod m

pow.rb


n, m, p = gets.split.map(&:to_i)
puts n.pow(p, m)

zisaku.rb


n, m, p = gets.split.map(&:to_i)
def mpow(n, p, mod)
  r = 1
  while p > 0
    r = r * n % mod if p % 2 == 1
    n = n * n % mod
    p >>= 1
  end
  r
end
puts mpow(n, p, m)
Integer#pow Mpow fait maison
Longueur du code(Byte) 50 183
Temps d'exécution(ms) 68 62
Mémoire(KB) 14356 14356

AtCoder Regular Contest 066 C - Lining Up

pow.rb


n = gets.to_i
a = gets.split.map(&:to_i)
h = Hash.new(0)
a.each do |x|
  h[x] += 1
end
f = true
h.each do |k, v|
  if n.odd? && k == 0
    if v != 1
      f = false
      break
    end
  elsif v != 2
    f = false
    break
  end
end
MOD = 1_000_000_007
puts (f ? 2.pow(n / 2, MOD) : 0)
Integer#pow Mpow fait maison
Longueur du code(Byte) 305 438
Temps d'exécution(ms) 101 100
Mémoire(KB) 22676 22488

Concours de programmation Acing 2020

pow.rb


n = gets.to_i
x = gets.chomp
xs = x.to_i(2)
xc = x.count('1')
def mpow(n, p, mod)
  return 0 if mod.zero?
  n.pow(p, mod)
end
def popcount(u)
  return 0 if u.zero?
  a = u % u.to_s(2).count('1')
  1 + popcount(a)
end
xsp = mpow(xs, 1, xc + 1)
xsm = mpow(xs, 1, xc - 1)
n.times do |i|
  if x[i] == '0'
    y = xsp + mpow(2, n - i - 1, xc + 1)
    y = mpow(y, 1, xc + 1)
  elsif xc == 1
    puts '0'
    next
  else
    y = xsm - mpow(2, n - i - 1, xc - 1)
    y = mpow(y, 1, xc - 1)
  end
  puts popcount(y) + 1
end
Integer#pow Mpow fait maison
Longueur du code(Byte) 541 629
Temps d'exécution(ms) 421 625
Mémoire(KB) 14704 15392

Tous étaient égaux ou meilleurs. L'ère du «rubis» est arrivée.

Résumé

Site référencé instance method Integer#**

Recommended Posts

Integer # pow est recommandé pour résoudre à plusieurs reprises la méthode du carré dans Ruby
ABC177-Résoudre E avec Ruby
Entiers qui sont unifiés en entiers dans Ruby 2.4
[Ruby] À quoi sert «!!»?
Micro-benchmark pour les nombres à virgule flottante à la puissance des entiers dans Ruby
[Note technique] Qu'est-ce que "inclure" dans Ruby?
[Débutant] Divers traitements itératifs pour les tableaux Ruby
Conseils pour la gestion des erreurs de gRPC dans Ruby