求第n个斐波那契数模一个数的值
import java.io.*;
import java.util.*;
public class Main{
static int mod;
public static void main(String[] args){
quickin in = new quickin();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
int n = in.nextInt();
mod = in.nextInt();
matrix m = new matrix(0,1,1,1);
matrix ans = qpow(m,n-1);
System.out.println((ans.a1+ans.a2)%mod);
}
public static matrix mul(matrix x, matrix y){
int i = (x.a1*y.a1+x.a2*y.b1)%mod;
int j = (x.a1*y.a2+x.a2*y.b2)%mod;
int k = (x.b1*y.a1+x.b2*y.b1)%mod;
int l = (x.b1*y.a2+x.b2*y.b2)%mod;
return new matrix(i,k,j,l);
}
public static matrix qpow(matrix a, int n){
matrix ans = new matrix(1,0,0,1);
while(n!=0){
if((n&1)==1){
ans=mul(ans,a);
}
a=mul(a,a);
n=n>>1;
}
return ans;
}
}
class quickin{
BufferedReader br;
StringTokenizer st;
quickin(){
br = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext(){
while(st==null||!st.hasMoreElements()){
try{
st = new StringTokenizer(br.readLine());
}catch(Exception e){
return false;
}
}
return true;
}
String next(){
if(hasNext()) return st.nextToken();
return null;
}
int nextInt(){
return Integer.parseInt(next());
}
}
class matrix{
int a1;
int b1;
int a2;
int b2;
public matrix(int a1, int b1, int a2, int b2) {
this.a1 = a1;
this.b1 = b1;
this.a2 = a2;
this.b2 = b2;
}
}