- import scala.collection.mutable.{Map => MMap}
- import scala.collection.mutable.{Set => MSet}
- object Wrapper {
- val Array(cardPubKey, doorPubKey) = scala.io.Source.fromFile("input").getLines.toArray.map(BigInt.apply)
- val M = 20201227
- val one = bi("1")
- val seven = bi("7")
- def bi(s: String) = BigInt(s)
- def powMod(subject: BigInt, n : Int):BigInt = n match {
- case 0 => one
- case 1 => subject.mod(M)
- case n => if(n%2 == 0) {
- val half = powMod(subject, n/2).mod(M)
- (half*half).mod(M)
- } else {
- val half = powMod(subject, n/2).mod(M)
- (half*half*subject).mod(M)
- }
- }
- def search(target: BigInt): Int = {
- var loop=0
- var check = powMod(seven, loop)
- while(check != target){
- loop += 1
- check = powMod(seven, loop)
- }
- loop
- }
- def solve() = {
- println(cardPubKey, doorPubKey)
- val cardLoop = search(cardPubKey)
- val doorLoop = search(doorPubKey)
- println(powMod(doorPubKey, cardLoop))
- println(powMod(cardPubKey, doorLoop))
- }
- }
- Wrapper.solve()