目标是计算 F(n) 模 m(m 最大为 10 的 5 次方),其中 n 可能非常大:最大为 10 的 18 次方。
我的算法太慢了。
我的方法:计算并存储最多 m 的所有斐波那契数,然后迭代该数组并对斐波那契数应用模。
一旦找到皮萨诺周期的长度,我可以使用这个长度来计算任何的模F(n)
我的代码:
import java.math.BigInteger;
import java.util.*;
public class FibonacciAgain {
private static ArrayList<BigInteger> calc_fib() {
ArrayList<BigInteger> fib = new ArrayList<>();
fib.add(BigInteger.ZERO);
fib.add(BigInteger.ONE);
for (int i = 2; i <= 100000; i++) {
fib.add(fib.get(i - 2).add(fib.get(i - 1)));
}
return fib;
}
private static long calculatePeriod(ArrayList<BigInteger> fib, long modulo) {
long periodLength = 0;
boolean periodFound = false;
long[] period = new long[1000000];
period[0] = 0;
period[1] = 1;
period[2] = 1;
int i = 3;
while (!periodFound) {
//period[i] = fib.get(i)
//period[i]= fib.get(i).divide(new BigInteger(String.valueOf(i))).longValue();
//System.out.println("Fib at " + i + ": " + fib.get(i));
period[i] = fib.get(i).mod(new BigInteger(String.valueOf(modulo))).longValue();
//System.out.println("1:" + period[i]);
//System.out.println("2:" + period[i - 1]);
// System.out.println("3: " + period[i - 2]);
if (i == 100000){
periodFound = true;
periodLength = i - 1;
}
// if (period[i] == 1 && period[i - 1] == 1 && period[i - 2] == 0) {
if (period[i - 1] == 1 && period[i - 2] == 0) {
periodFound = true;
periodLength = i - 2;
//System.out.println("found");
}
i++;
}
//System.out.println("Period Length:" + periodLength);
return periodLength;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long m = scanner.nextLong();
}
}
有什么建议,如何让它更快?
繁花不似锦
慕仙森
相关分类