İçeriğe atla
ΣDSA Patterns
Menü
Dil

Matematik & Sayı Teorisi

Rehber 5 / 6 · Yol 5 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
2
^
1
0

mod 1337

2^[1,0] mod 1337 hesapla. Üs bir basamak dizisi, 64-bit int'e sığmaz.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Super Pow

Problem (yeniden ifade)

a^b mod 1337 hesapla; üs b ondalık basamak dizisi olarak verilir (64-bit int’e sığmaz).

Sezgi

a^[1,0,2] = ((a^1)^10 · a^0)^10 · a^2. Basamakları soldan sağa tara: her basamakta çalışan cevabı 10. üsse yükselt ve a^basamak ile çarp, hepsi mod 1337. Küçük üsler LC 50 ile aynı ikili üs alma.

Yaklaşımlar

Basamak basamak modPow

Doğrulanmadı
Zaman O(d log 10)Alan O(1)

Fikir. ans = 1. b’nin her d basamağı için: ans = modPow(ans, 10) * modPow(a, d) % 1337. modPow her çarpımdan sonra % 1337 ile kare-ve-çarp.

Yürüyüş. a = 2, b = [1,0] → 1’den sonra: 2; 0’dan sonra: 2^10 = 1024. a = 2, b = [3] → 8.

Trade-off. Tabanı önce % 1337 yap. C#/JS çarpmayı 64-bit (veya number) ile yapıp sonra indir — int * int taşar. Euler (φ(1337)=1140) isteğe bağlıdır ve gcd(a, 1337) = 1 ister.

Çözüm
const MOD = 1337;

function modPow(base: number, exp: number): number {
  let b = ((base % MOD) + MOD) % MOD;
  let r = 1;
  while (exp > 0) {
    if (exp % 2 === 1) r = (r * b) % MOD;
    b = (b * b) % MOD;
    exp = Math.floor(exp / 2);
  }
  return r;
}

export function superPow(a: number, b: number[]): number {
  let ans = 1;
  for (const d of b) {
    ans = (modPow(ans, 10) * modPow(a, d)) % MOD;
  }
  return ans;
}
const MOD = 1337;

function modPow(base: number, exp: number): number {
  let b = ((base % MOD) + MOD) % MOD;
  let r = 1;
  while (exp > 0) {
    if (exp % 2 === 1) r = (r * b) % MOD;
    b = (b * b) % MOD;
    exp = Math.floor(exp / 2);
  }
  return r;
}

export function superPow(a: number, b: number[]): number {
  let ans = 1;
  for (const d of b) {
    ans = (modPow(ans, 10) * modPow(a, d)) % MOD;
  }
  return ans;
}

Şablon bağlantısı

Math & Number Theory’nin modular-exponent şekli: LC 50’nin kare-ve-çarp’ı, modulus ve basamak-dizi üs ile. Her çarpımdan sonra % m.

Yansıma