Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.math.BigInteger;
- import java.util.Scanner;
- class Fib {
- static BigInteger calcSlow(int n) {
- if (n <= 1)
- return n == 0 ? BigInteger.ZERO : BigInteger.ONE;
- BigInteger f0 = BigInteger.ZERO, f1 = BigInteger.ONE, f2;
- for (int i = 0; i < n - 1; i++) {
- f2 = f0.add(f1);
- f0 = f1;
- f1 = f2;
- }
- return f1;
- }
- static int calcMod(int n, long MOD) {
- Matrix m = new Matrix(2);
- m.a[0][0] = m.a[0][1] = m.a[1][0] = 1;
- return (int) Matrix.powMod(m, n, MOD).a[0][1];
- }
- static class Matrix {
- int n;
- long[][] a;
- Matrix(int n) {
- this.n = n;
- this.a = new long[n][n];
- }
- static Matrix multiply(Matrix m1, Matrix m2, long MOD) {
- int n = m1.n;
- Matrix ret = new Matrix(n);
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- for (int t = 0; t < n; t++) {
- ret.a[i][j] += m1.a[i][t] * m2.a[t][j];
- ret.a[i][j] %= MOD;
- }
- }
- }
- return ret;
- }
- static Matrix id(int n) {
- Matrix ret = new Matrix(n);
- for (int i = 0; i < n; i++)
- ret.a[i][i] = 1;
- return ret;
- }
- // evaluates matr^n modulo MOD
- static Matrix powMod(Matrix matr, int n, long MOD) {
- if (n == 0)
- return id(2);
- Matrix t = Matrix.powMod(matr, n / 2, MOD);
- t = Matrix.multiply(t, t, MOD);
- return n % 2 == 0 ? t : Matrix.multiply(t, matr, MOD);
- }
- }
- public static void main(String[] args) {
- int n = new Scanner(System.in).nextInt();
- System.out.println(calcSlow(n));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement