using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.IO; using static System.Console; using static System.Math; public class Solve{ static public int mod = 1000000007; static public string al = "abcdefghijklmnopqrstuvwxyz"; public static void Main(){ // 方針 // var n = inta(); var fib = new long[2,2]{{1,1},{1,0}}; var ms = new Matrixsquare(fib); var matrix = ms.IterativeSquare(n[0]-2); long ans = matrix[0,0]; WriteLine(ans%n[1]); } public static void swap(ref int a,ref int b){int temp = a;a= b;b = temp;} static void charswap(ref char a,ref char b){char temp = a;a= b;b = temp;} static int ncr(int n,int r){if(n=0;i--){if(binary[i] == '1'){value = value*a_power%mod;}a_power = a_power*a_power%mod;}return (int)value;} static int square2(int a,int b){long output = 1;var list = new List();int sh = 1;long n = a;list.Add(a);while(sh < b){sh *= 2;n = n*n%mod;list.Add(n);}for(int i=list.Count-1;i>=0;i--){if(b > sh){b -= sh;sh /= 2;output = output*list[i]%mod;}}return (int)output;} //各種読取 static string rstr(){ return ReadLine(); } static int rint(){ return int.Parse(ReadLine()); } static long rlong(){ return long.Parse(ReadLine()); } static string[] stra(){ return ReadLine().Split(' '); } static char[] chara(){ string[] a=stra();string b="";for(int i=0;i _priorityqueue = new List(); public void Enqueue(int a){ _priorityqueue.Add(a); int num = _priorityqueue.Count-1; while(true){ if(num == 0) break; if(_priorityqueue[(num-1)/2] < _priorityqueue[num]){ //大小逆の時弄るとこ int temp = _priorityqueue[(num-1)/2]; _priorityqueue[(num-1)/2] = _priorityqueue[num]; _priorityqueue[num] = temp; num = (num-1)/2; }else{ break; } } } public int Dequeue(){ int re = _priorityqueue[0]; int temp = _priorityqueue[0]; _priorityqueue[0] = _priorityqueue[_priorityqueue.Count-1]; _priorityqueue[_priorityqueue.Count-1] = temp; _priorityqueue.RemoveAt(_priorityqueue.Count-1); int num = 0; while(true){ int swapnum = -1; if((num+1)*2 < _priorityqueue.Count){ if(_priorityqueue[num*2+1] > _priorityqueue[(num+1)*2]){ //大小逆の時弄るとこ swapnum = num*2+1; }else{ swapnum = (num+1)*2; } }else if(num*2+1 < _priorityqueue.Count){ swapnum = num*2+1; } if(swapnum == -1) break; if(_priorityqueue[swapnum] > _priorityqueue[num]){ //大小逆の時弄るとこ temp = _priorityqueue[swapnum]; _priorityqueue[swapnum] = _priorityqueue[num]; _priorityqueue[num] = temp; num = swapnum; }else{ break; } } return re; } public int Peek(){ return _priorityqueue[0]; } public int Count(){ return _priorityqueue.Count; } } class PriorityQueue2{ private List _priorityqueue = new List(); private List _accompany_info = new List(); public void Enqueue(int a,int b){ _priorityqueue.Add(a); _accompany_info.Add(b); int num = _priorityqueue.Count-1; while(true){ if(num == 0) break; if(_priorityqueue[(num-1)/2] > _priorityqueue[num]){ //大小逆の時弄るとこ int temp = _priorityqueue[(num-1)/2]; _priorityqueue[(num-1)/2] = _priorityqueue[num]; _priorityqueue[num] = temp; temp = _accompany_info[(num-1)/2]; _accompany_info[(num-1)/2] = _accompany_info[num]; _accompany_info[num] = temp; num = (num-1)/2; }else{ break; } } } public int[] Dequeue(){ var re = new int[]{_priorityqueue[0],_accompany_info[0]}; var qcount = _priorityqueue.Count; var temp = _priorityqueue[0]; _priorityqueue[0] = _priorityqueue[qcount-1]; _priorityqueue[qcount-1] = temp; temp = _accompany_info[0]; _accompany_info[0] = _accompany_info[qcount-1]; _accompany_info[qcount-1] = temp; _priorityqueue.RemoveAt(qcount-1); _accompany_info.RemoveAt(qcount-1); int num = 0; while(true){ int swapnum = -1; if((num+1)*2 < _priorityqueue.Count){ if(_priorityqueue[num*2+1] < _priorityqueue[(num+1)*2]){ //大小逆の時弄るとこ swapnum = num*2+1; }else{ swapnum = (num+1)*2; } }else if(num*2+1 < _priorityqueue.Count){ swapnum = num*2+1; } if(swapnum == -1) break; if(_priorityqueue[swapnum] < _priorityqueue[num]){ //大小逆の時弄るとこ temp = _priorityqueue[swapnum];_priorityqueue[swapnum] = _priorityqueue[num];_priorityqueue[num] = temp; temp = _accompany_info[swapnum];_accompany_info[swapnum] = _accompany_info[num];_accompany_info[num] = temp; num = swapnum; }else{ break; } } return re; } public int[] Peek(){ var temp = new int[]{_priorityqueue[0],_accompany_info[0]}; return temp; } public int Count(){ return _priorityqueue.Count; } } class PriorityQueue3{ private List _priorityqueue = new List(); private List _accompany_info = new List(); private List _accompany_info2 = new List(); public void Enqueue(int a,int b,int c){ _priorityqueue.Add(a); _accompany_info.Add(b); _accompany_info2.Add(c); int num = _priorityqueue.Count-1; while(true){ if(num == 0) break; if(_priorityqueue[(num-1)/2] > _priorityqueue[num]){ //大小逆の時弄るとこ int temp = _priorityqueue[(num-1)/2]; _priorityqueue[(num-1)/2] = _priorityqueue[num]; _priorityqueue[num] = temp; temp = _accompany_info[(num-1)/2]; _accompany_info[(num-1)/2] = _accompany_info[num]; _accompany_info[num] = temp; temp = _accompany_info2[(num-1)/2]; _accompany_info2[(num-1)/2] = _accompany_info2[num]; _accompany_info2[num] = temp; num = (num-1)/2; }else{ break; } } } public int[] Dequeue(){ var re = new int[]{_priorityqueue[0],_accompany_info[0],_accompany_info2[0]}; var qcount = _priorityqueue.Count; var temp = _priorityqueue[0]; _priorityqueue[0] = _priorityqueue[qcount-1]; _priorityqueue[qcount-1] = temp; temp = _accompany_info[0]; _accompany_info[0] = _accompany_info[qcount-1]; _accompany_info[qcount-1] = temp; temp = _accompany_info2[0]; _accompany_info2[0] = _accompany_info2[qcount-1]; _accompany_info2[qcount-1] = temp; _priorityqueue.RemoveAt(qcount-1); _accompany_info.RemoveAt(qcount-1); _accompany_info2.RemoveAt(qcount-1); int num = 0; while(true){ int swapnum = -1; if((num+1)*2 < _priorityqueue.Count){ if(_priorityqueue[num*2+1] < _priorityqueue[(num+1)*2]){ //大小逆の時弄るとこ swapnum = num*2+1; }else{ swapnum = (num+1)*2; } }else if(num*2+1 < _priorityqueue.Count){ swapnum = num*2+1; } if(swapnum == -1) break; if(_priorityqueue[swapnum] < _priorityqueue[num]){ //大小逆の時弄るとこ temp = _priorityqueue[swapnum];_priorityqueue[swapnum] = _priorityqueue[num];_priorityqueue[num] = temp; temp = _accompany_info[swapnum];_accompany_info[swapnum] = _accompany_info[num];_accompany_info[num] = temp; temp = _accompany_info2[swapnum];_accompany_info2[swapnum] = _accompany_info2[num];_accompany_info2[num] = temp; num = swapnum; }else{ break; } } return re; } public int[] Peek(){ var temp = new int[]{_priorityqueue[0],_accompany_info[0],_accompany_info2[0]}; return temp; } public int Count(){ return _priorityqueue.Count; } } class Permutation{ private int[] _permutation; private int _length; public Permutation(int a){ _permutation = new int[a]; for(int i=0;i(); upper++; for(int i=upper;i<_length;i++){ list.Add(_permutation[i]); } list.Reverse(); for(int i=upper;i<_length;i++){ _permutation[i] = list[i-upper]; } return true; } public void prev0(){ Array.Reverse(_permutation); } public bool prev(){ var lower = -1; for(int i=0;i<_length-1;i++){ if(_permutation[i] > _permutation[i+1]) lower = i; } if(lower == -1){ return false; } var smaller = -1; for(int i=lower;i<_length;i++){ if(_permutation[lower] >= _permutation[i]) smaller = i; } var temp = _permutation[lower]; _permutation[lower] = _permutation[smaller]; _permutation[smaller] = temp; var list = new List(); lower++; for(int i=lower;i<_length;i++){ list.Add(_permutation[i]); } list.Reverse(); for(int i=lower;i<_length;i++){ _permutation[i] = list[i-lower]; } return true; } } class RMQ{ private int[] _rmq; private int _number = -1; private int inf = 2147483647; public RMQ(int a){ int n = 1; while(n < a) n*=2; _number = n-1; n = n*2-1; _rmq = new int[n]; } public void Initialize(int a){ for(int i=0;i<_rmq.Length;i++){ _rmq[i] = a; } } public void Change(int num,int value){ var changenum = _number + num; _rmq[changenum] = value; while(changenum > 0){ changenum = (changenum-1)/2; _rmq[changenum] = Min(_rmq[changenum*2+1],_rmq[changenum*2+2]); } } public int Query(int a,int b){return act_query(a,++b,0,0,_number+1);} public int act_query(int a,int b,int k,int l,int r){ if(b <= l || r <= a){ return inf; } if(a <= l && r <= b){ return _rmq[k]; } int vl = act_query(a,b,k*2+1,l,(l+r)/2); int vr = act_query(a,b,k*2+2,(l+r)/2,r); return Min(vl,vr); } } class RMS{ private int[] _rms; private int _number = -1; private int zero = 0; public RMS(int a){ int n = 1; while(n < a) n*=2; _number = n-1; n = n*2-1; _rms = new int[n]; } public void Change(int num,int value){ var changenum = _number + num; _rms[changenum] = value; while(changenum > 0){ changenum = (changenum-1)/2; _rms[changenum] = _rms[changenum*2+1] + _rms[changenum*2+2]; } } public int Query(int a,int b){return act_query(a,++b,0,0,_number+1);} public int act_query(int a,int b,int k,int l,int r){ if(b <= l || r <= a){ return zero; } if(a <= l && r <= b){ return _rms[k]; } int vl = act_query(a,b,k*2+1,l,(l+r)/2); int vr = act_query(a,b,k*2+2,(l+r)/2,r); return vl + vr; } public void Check(){ for(int i=0;i<_rms.Length;i++){ WriteLine(_rms[i]); } } } class bitRMS{ private int[] _rms; private int _number = -1; private int zero = 0; public bitRMS(int a){ int n = 1; while(n < a) n*=2; _number = n-1; n = n*2-1; _rms = new int[n]; } public void Change(int num,int value){ var changenum = _number + num; _rms[changenum] = value; while(changenum > 0){ changenum = (changenum-1)/2; _rms[changenum] = _rms[changenum*2+1] | _rms[changenum*2+2]; } } public int Query(int a,int b){return act_query(a,++b,0,0,_number+1);} public int act_query(int a,int b,int k,int l,int r){ if(b <= l || r <= a){ return zero; } if(a <= l && r <= b){ return _rms[k]; } int vl = act_query(a,b,k*2+1,l,(l+r)/2); int vr = act_query(a,b,k*2+2,(l+r)/2,r); return vl | vr; } public void Check(){ for(int i=0;i<_rms.Length;i++){ WriteLine(_rms[i]); } } } class BIT{ private long[] _bit; private int leng; public BIT(int a){ _bit = new long[a+1]; leng = _bit.Length; } public void Change(int a,long b){ while(a <= leng){ _bit[a] += b; a += -a & a; } } public long Query(int a,int b){ a--; long ret = 0; while(b > 0){ ret += _bit[b]; b -= -b & b; } while(a > 0){ ret -= _bit[a]; a -= -a & a; } return ret; } } class Matrixsquare{ private long[,] _matrix; private long[,] _E; private int _mod = 1000000007; public Matrixsquare(long[,] a){ var leng = a.GetLength(0); _matrix = new long[leng,leng]; _E = new long[leng,leng]; for(int i=0;i 0){ if(a %2 == 1){ _E = MultiMatrix(_E,_matrix); } a = a>>1; _matrix = MultiMatrix(_matrix,_matrix); } return _E; } public long[,] MultiMatrix(long[,] a,long[,] b){ var m = a.GetLength(0); var ret = new long[m,m]; for(int i=0;i