1. import scala.collection.mutable.{Map => MMap}
  2. import scala.collection.mutable.{Set => MSet}
  3. object Wrapper {
  4. val Array(cardPubKey, doorPubKey) = scala.io.Source.fromFile("input").getLines.toArray.map(BigInt.apply)
  5. val M = 20201227
  6. val one = bi("1")
  7. val seven = bi("7")
  8. def bi(s: String) = BigInt(s)
  9. def powMod(subject: BigInt, n : Int):BigInt = n match {
  10. case 0 => one
  11. case 1 => subject.mod(M)
  12. case n => if(n%2 == 0) {
  13. val half = powMod(subject, n/2).mod(M)
  14. (half*half).mod(M)
  15. } else {
  16. val half = powMod(subject, n/2).mod(M)
  17. (half*half*subject).mod(M)
  18. }
  19. }
  20. def search(target: BigInt): Int = {
  21. var loop=0
  22. var check = powMod(seven, loop)
  23. while(check != target){
  24. loop += 1
  25. check = powMod(seven, loop)
  26. }
  27. loop
  28. }
  29. def solve() = {
  30. println(cardPubKey, doorPubKey)
  31. val cardLoop = search(cardPubKey)
  32. val doorLoop = search(doorPubKey)
  33. println(powMod(doorPubKey, cardLoop))
  34. println(powMod(cardPubKey, doorLoop))
  35. }
  36. }
  37. Wrapper.solve()