有一对兔子,从出生起后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问第二十个月的兔子对数为多少? 规律: 1,1,2,3,5,8,13... 规则:A.从第三个月开始,第一项是前两项之和。 B.说明前两项是已知的。
其实就是斐波那契数列,斐波那契数列增长的特别快,计算第20个值,什么方法都可以,但计算第20亿个值,我暂时只知道矩阵快速幂做,而且求的是某个数的余数,如果想得到精确值,得用BigInteger
public static void main(String[] args) {
long num1 = 1;
long num2 = 1;
Scanner sc = new Scanner(System.in);
long num = sc.nextLong();//第num个月兔子总数
long numPrint = num;
long[][] matrix = {{1,1},{1,0}};//乘积矩阵
long num3 = 87654321L;//求第num个月兔子总数对num3的余数
//矩阵快速幂
long[][] matrResult = {{1,0},{0,1}};
num -= 2;//求第3个月兔子总数,只需求矩阵1次方,同理第num个月需求矩阵num-2次方
while(num>0){
if((num&1)==1){
matrResult = matrMulti(matrResult,matrix,num3);
}
matrix = matrMulti(matrix,matrix,num3);
num >>= 1;
}
System.out.println("第"+numPrint+"个月兔子总数为"+num3+"的余数是"+(matrResult[0][0]+matrResult[0][1])%num3);
}
private static long[][] matrMulti(long[][] matrResult, long[][] matrix,long num3) {
int n=2,m=2;//n*m矩阵
long[][] matrix2 = new long[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int j2 = 0; j2 < m; j2++) {
matrix2[i][j] +=matrResult[i][j2]*matrix[j2][j] %num3;
}
}
}
return matrix2;
}
input:123456789987654321
output:第123456789987654321个月兔子总数为87654321的余数是42542071