using System;
class GFG
{
static readonly int maxSize = 50;
static double [,] matrix_product( double [,] a,
double [,] b)
{
double [,] c = new double [7, 7];
for ( int i = 0; i < 7; i++)
for ( int j = 0; j < 7; j++)
for ( int k = 0; k < 7; k++)
c[i, j] += a[i, k] * b[k, j];
return c;
}
static double [,] mul_expo( double [,] mul, int p)
{
double [,] s = {{ 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 1 }};
while (p != 1)
{
if (p % 2 == 1)
s = matrix_product(s, mul);
mul = matrix_product(mul, mul);
p /= 2;
}
return matrix_product(mul, s);
}
static double expectedSteps( int x)
{
if (x == 0)
return 0;
if (x <= 6)
return 6;
double [,]mul = {{( double )7 / 6, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 1 },
{( double ) - 1 / 6, 0, 0,
0, 0, 0, 0 }};
mul = mul_expo(mul, x - 6);
return (mul[0, 0] + mul[1, 0] + mul[2, 0] +
mul[3, 0] + mul[4, 0] + mul[5, 0]) * 6;
}
public static void Main(String[] args)
{
int n = 10;
Console.Write( "{0:f5}" , expectedSteps(n - 1));
}
}
|