import java.util.Scanner; public class FibAgain { // public static BigInteger getFib(int n) { // if (n <= 1) // return BigInteger.valueOf(n); // final BigInteger[] fibArray = new BigInteger[n + 1]; // fibArray[0] = BigInteger.valueOf(0); // fibArray[1] = BigInteger.valueOf(1); // for (int i = 2; i < n + 1; i++) { // fibArray[i] = fibArray[i - 1].add(fibArray[i - 2]); // } // return fibArray[n]; // } // // public static BigInteger getFibOptimized(int n) { // if (n <= 1) // return BigInteger.valueOf(n); // final BigInteger[] fibArray = new BigInteger[n + 1]; // BigInteger firstFib = BigInteger.valueOf(0); // BigInteger secondFib = BigInteger.valueOf(1); // BigInteger tempHolder = BigInteger.valueOf(0); // for (int i = 2; i < n + 1; i++) { // tempHolder = firstFib.add(secondFib); // firstFib = secondFib; // secondFib = tempHolder; // } // return secondFib; // } public static int getPisanoPeriodOptimized(int m) { // this optimized algorithm is obtained through the // discussion starting around 7:30 mark of the following // video. We know the upper bound for the loop, which // is 6*m, through articles listed above // https://www.youtube.com/watch?v=Nu-lW-Ifyec // https://en.wikipedia.org/wiki/Pisano_period // The unoptimized naive algorithm looks for modulus // 0 followed by 1 int period = 2; int remainder1 = 1; int remainder2 = 1; for (int i = 3; i <= 6 * m; i++) { period++; if (remainder2 == 1 && (remainder1 + remainder2 == m)) { break; } else { int tempHolder = remainder1 + remainder2; remainder1 = remainder2; if (tempHolder >= m) { remainder2 = tempHolder - m; } else { remainder2 = tempHolder; } } } return period; } public static int getFibNModM(long n, int m) { int p = getPisanoPeriodOptimized(m); long r = n % p; if (r == 0) return 0; int firstN = 0; int secondN = 1; int tempHolder = 1; for (int i = 1; i < r; i++) { tempHolder = (firstN+secondN)%m; firstN = secondN; secondN=tempHolder; } return secondN; } public static void main(String args[]) { Scanner in = new Scanner(System.in); long n = in.nextLong(); int m = in.nextInt(); System.out.println(getFibNModM(n, m)); } }