using System;
using System.Collections.Generic;
using System.Linq;
namespace YukiCoder526
{
class Program
{
static void Main(string[] args)
{
var NM = ReadInt();
int N = NM[0];
int M = NM[1];
long[,] A = new long[2, 2];
A[0, 0] = 1; A[0, 1] = 1;
A[1, 0] = 1; A[1, 1] = 0;
A = Pow(A, N - 1, M);
//DrawMapforDebug(A);
Console.WriteLine(A[1, 0]);
Console.ReadKey();
}
///
/// 行列積
///
///
///
///
///
static long[,] Multi(long[,] A, long[,] B, long mod)
{
long[,] R = new long[A.GetLength(0), B.GetLength(1)];
for (long i = 0; i < A.GetLength(0); i++)
{
for (long k = 0; k < B.GetLength(0); k++)
{
for (long j = 0; j < B.GetLength(1); j++)
{
R[i, j] = (long)(R[i, j] + (long)A[i, k] * B[k, j]) % mod;
}
}
}
return R;
}
///
/// 行列累乗
///
///
///
///
///
static long[,] Pow(long[,] A, long n, long mod)
{
long width = A.GetLength(0);
if (width != A.GetLength(1))
{
Console.WriteLine("it is not square matrix.");
}
long[,] B = new long[width, width];
Array.Copy(A, B, A.Length);
long[,] R = new long[width, width];
for (long i = 0; i < width; i++)
{
R[i, i] = 1;
}
while (n > 0)
{
//DrawMapforDebug(B);
if ((n & 1) > 0) R = Multi(R, B, mod);
B = Multi(B, B, mod);
n >>= 1;
}
return R;
}
///
/// 二次元配列の可視化メソッド
///
///
static void DrawMapforDebug(int[,] map)
{
int W = map.GetLength(0);
int H = map.GetLength(1);
int[,] map2 = new int[W + 1, H + 1];
for (int i = 0; i < W + 1; i++)
{
for (int j = 0; j < H + 1; j++)
{
if (i == 0 && j == 0) map2[i, j] = 0;
else if (i == 0) map2[i, j] = j - 1;
else if (j == 0) map2[i, j] = i - 1;
else map2[i, j] = map[i - 1, j - 1];
}
}
for (int i = 0; i < W + 1; i++)
{
for (int j = 0; j < H + 1; j++)
{
Console.Write(map2[i, j] % 10);
}
Console.WriteLine();
}
Console.WriteLine();
}
static int[] ReadInt()
{
int[] ret = Console.ReadLine().Split().Select(int.Parse).ToArray();
return ret;
}
static long[] ReadLong()
{
long[] ret = Console.ReadLine().Split().Select(long.Parse).ToArray();
return ret;
}
}
}