private static FibMatrix BinPow(FibMatrix val, int pow) { FibMatrix res = new FibMatrix(1, 0, 0, 1); if (pow == 0) { return(res); } bool isNegative = pow > 0 ? false : true; var exp = Math.Abs(pow); while (exp > 0) { if (exp % 2 == 1) { res *= val; } val *= val; exp >>= 1; } if (isNegative) { return(1 / (res.a00 * res.a11 - res.a01 * res.a10) * (new FibMatrix(res.a11, (-1) * res.a01, (-1) * res.a10, res.a00))); } else { return(res); } }
static public void Main() { string[] stringArray = Console.ReadLine().Split(' '); long[] intArray = Array.ConvertAll(stringArray, Int64.Parse); var m = new FibMatrix(1, 1, 1, 0); m = m.RaiseMatrixByPowerMod(intArray[0] - 1, intArray[1]); Console.WriteLine(m.Result()); string[] stringArray23 = Console.ReadLine().Split(' '); }
public FibMatrix MultiplyMod(FibMatrix v, long divisor) { var result = new FibMatrix(); var i = v.e1; var j = v.e2; result.e1 = (e1 * i + e3 * j) % divisor; result.e2 = (e2 * i + e4 * j) % divisor; i = v.e3; j = v.e4; result.e3 = (e1 * i + e3 * j) % divisor; result.e4 = (e2 * i + e4 * j) % divisor; return(result); }