题目描述
对于斐波拉切数列,
f0=0,f1=1,
对于n>=2,定义
fn=(fn−1+fn−2)mod10
输入
0≤k≤1018
输出
计算fk
样例输入
0
1
2
样例输出
0
1
1
方法:
矩阵快速幂
推导过程:
代码:
import java.util.Arrays;
import java.util.Scanner;
public class L {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNextLong()){
System.out.println(fast(cin.nextLong()));
}
}
static int[][] mul(int[][] a,int[][] b){
int[][] res=new int[2][2];
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length;j++){
for(int k=0;k<a.length;k++)
res[i][j]=(res[i][j]+a[i][k]*b[k][j])%10;
}
}
return res;
}
static int fast(long n){
if(n==0)
return 0;
n--;
int[][] res=new int[2][2];
int[][] base=new int[2][2];
for(int i=0;i<res.length;i++)
res[i][i]=1;
base[0][0]=base[0][1]=base[1][0]=1;
while(n>0){
if(n%2==1){
res=mul(res,base);
}
base=mul(base,base);
n>>=1;
}
return res[0][0];
}
}