def test_calc_fib(n, fib_last_digit): assert get_fibonacci_last_digit(n) == fib_last_digit
def test_200(self): self.assertEqual(1, get_fibonacci_last_digit(200))
def test_64(self): self.assertEqual(2, get_fibonacci_last_digit(64))
def test_100(self): self.assertEqual(6, get_fibonacci_last_digit(100))
def test_150(self): self.assertEqual(9, get_fibonacci_last_digit(150))
def test_with_preceeding_lower_bound(self): get_fibonacci_last_digit(-1)
def test_get_fibonacci_last_digit(n, expected): assert get_fibonacci_last_digit(n) == expected
def test_with_n_as_327305(self): self.assertEqual(5, get_fibonacci_last_digit(327305))
def test_with_n_as_10000000(self): self.assertEqual(5, get_fibonacci_last_digit(10000000))
def test_with_n_as_9(self): self.assertEqual(4, get_fibonacci_last_digit(9))
def test_with_n_as_30(self): self.assertEqual(0, get_fibonacci_last_digit(30))
def test_with_n_as_8(self): self.assertEqual(1, get_fibonacci_last_digit(8))
def test_with_n_as_7(self): self.assertEqual(3, get_fibonacci_last_digit(7))
def test_with_n_as_6(self): self.assertEqual(8, get_fibonacci_last_digit(6))
def test_with_n_as_3(self): self.assertEqual(2, get_fibonacci_last_digit(3))
if n <= 1: return n previous = 0 current = 1 period = [] period.append(previous) period.append(current) tmp = [] for _ in range(n - 1): previous, current = current, (previous + current) % m if len(period) > 0 and period[len(tmp)] == current: tmp.append(current) if len(period) == len(tmp): break else: if len(tmp) > 0: period.extend(tmp) #O(m)? tmp.clear() period.append(current) return period[n % len(period)] if __name__ == '__main__': input = sys.stdin.read() n, m = map(int, input.split()) for i in range(n): assert (get_fibonacci_last_digit(i, m) == get_fibonacci_huge(i, m)) print(get_fibonacci_huge(n, m))