可求出第n项的Fib,若n=1e18可求
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
static long mod=1000000007;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long n=sc.nextLong();
long f[][]= {{1,1},{1,0}};
Matrix fib=new Matrix(f);
Matrix ans=pow(fib,n);
System.out.println(ans.arr[0][1]);
}
public static Matrix pow(Matrix a,long b) { //求a的b次方
Matrix ans=Matrix.e(a.arr.length);
Matrix t=new Matrix(a.arr);
while(b!=0) {
if((b&1)!=0)
ans=Matrix.mul(ans,t,mod);
b=b>>1;
// b>>=1;
t=Matrix.mul(t,t,mod);
}
return ans;
}
}
class Matrix{
long arr[][];
public Matrix(long arr[][]) {
this.arr=new long[arr.length][arr[0].length];
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[0].length;j++) {
this.arr[i][j]=arr[i][j];
}
}
}
public static Matrix mul(Matrix m1,Matrix m2,long mod) {
long[][] a=m1.arr;
long[][] b=m2.arr;
if(a[0].length!=b.length)
return null;
long[][] c=new long[a.length][b[0].length];
for(int i=0;i<a.length;i++) {
for(int j=0;j<b[0].length;j++) {
long sum=0;
for(int k=0;k<a[0].length;k++) {
sum+=(a[i][k]*b[k][j])%mod;
sum%=mod;
}
c[i][j]=sum;
}
}
return new Matrix(c);
}
public static Matrix e(int n) {
long[][] arr=new long[n][n];
for(int i=0;i<n;i++) {
arr[i][i]=1;
}
return new Matrix(arr);
}
}