定义Fib数列:1,1,2,3,5,8,13,…1,1,2,3,5,8,13,…
求第NN项除以20102010的余数
输入仅一行,为一个整数NN
输出仅一行,为第NN项除以20102010的余数
3
2
对于70%的数据 N≤1,000,000N≤1,000,000
对于100%的数据 N≤210,000,000,000
解:
此题数据范围太大,long到第99位就吼不住了,数据类型需要用BigInteger;
对于时间也有限制,于是抛弃了递归,使用for循环解决,仍达不到要求;
再次审题,对2010进行取余,难道是2010年出的题?还是说有什么规律可循的捷径?
于是依次打印了从1到50000的结果,对结果分析后发现每隔2040个数字就循环一次,于是将n对2040取余,得解。
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long n = sc.nextLong(); n = n % 2040; System.out.println(fib3(n).divideAndRemainder(new BigInteger("2010"))[1]); } static BigInteger fib3(long n) { BigInteger n1 = new BigInteger("0"); BigInteger n2 = new BigInteger("1"); for (long i = 0; i < n; i++) { BigInteger temp = n1; n1 = n2.add(n1); n2 = temp; } return n1; } }
原文:https://www.cnblogs.com/chenglc/p/10881778.html