Esempio n. 1
0
    public int solve(long coins_sum, long[] values)
    {
        int i, j;

        Array.Sort(values);
        len = values.Length;
        Array.Reverse(values);
        long[] num = new long[len];
        for (i = 0; i < len; i++)
        {
            if (i == 0)
            {
                num[i] = coins_sum / values[i];
            }
            else
            {
                num[i] = (coins_sum % values[i - 1]) / values[i];
            }
        }
        Array.Reverse(values);

        long[,] dp     = new long[len, 1];
        dp[len - 1, 0] = 1;

        long[,] pow = new long[len, len];

        for (i = 0; i < len; i++)
        {
            for (j = 0; j <= i; j++)
            {
                pow[len - i - 1, len - j - 1] = 1;
            }
            long[,] nextdp = matmul(matpow(pow, num[len - i - 1]), dp);
            dp             = (long[, ])nextdp.Clone();

            if (i != len - 1)
            {
                long[,] nextpow = matpow(pow, (values[i + 1]) / values[i]);
                pow             = (long[, ])nextpow.Clone();
            }
        }
        long ret = 0;

        for (i = 0; i < len; i++)
        {
            ret = (ret + dp[i, 0]) % mod;
        }
        return((int)ret);
    }
Esempio n. 2
0
        /// <summary>
        /// 累積和の実施
        /// </summary>
        /// <returns>累積和結果の2Dマップ</returns>
        public long[,] Sum()
        {
            // 横方向への累積和
            for (int y = 0; y < Height; y++)
            {
                for (int x = 1; x < Width; x++)
                {
                    _map[y, x] += _map[y, x - 1];
                }
            }
            // 縦方向への累積和
            for (int y = 1; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    _map[y, x] += _map[y - 1, x];
                }
            }

            return(_map.Clone() as long[, ]);
        }
Esempio n. 3
0
    static long GetMinDistanceDp(long [,] path, int n, int m)
    {
        long [,] dp = (long [, ])path.Clone();
        for (int i = 1; i < dp.GetLength(1); i++)
        {
            dp[0, i] += dp[0, i - 1];
        }
        for (int i = 1; i < dp.GetLength(0); i++)
        {
            dp[i, 0] += dp[i - 1, 0];
        }

        for (int i = 1; i < dp.GetLength(0); i++)
        {
            for (int j = 1; j < dp.GetLength(1); j++)
            {
                dp[i, j] = dp[i, j] + Math.Min(Math.Min(dp[i - 1, j - 1], dp[i - 1, j]), dp[i, j - 1]);
            }
        }

        return(dp[dp.GetLength(0) - 1, dp.GetLength(1) - 1]);
    }
Esempio n. 4
0
 private CounterCollection(long[,] counters, long[,] durations, CounterCollection parent)
 {
     m_counters  = (long[, ])counters.Clone();
     m_durations = (long[, ])durations.Clone();
     m_parent    = parent;
 }
Esempio n. 5
0
 public Matrix(long[,] grid)
 {
     this.grid = (long[, ])
                 grid.Clone();
 }
Esempio n. 6
0
        public static string convertFrac(long[,] lst)
        {
            var denominators = new List <long>();

            for (int i = 0; i < lst.Length / 2; i++)
            {
                var denominator = lst[i, 1];
                denominators.Add(denominator);
            }

            long gcd = 1;

            denominators.Distinct().ToList().ForEach(x => gcd *= x);

            long[,] newList = (long[, ])lst.Clone();
            for (int i = 0; i < lst.Length / 2; i++)
            {
                var denominator = lst[i, 1];
                var temp        = gcd / denominator;
                var top         = lst[i, 0];
                newList[i, 0] = top * temp;
                newList[i, 1] = gcd;
            }

            long gcdReducer          = 1;
            var  allNumbersFlattened = newList.Cast <long>().ToArray().Distinct();

            var seed  = gcd;
            var found = false;
            var ii    = 1;

            do
            {
                if (allNumbersFlattened.All(x => (x % seed) == 0))
                {
                    found      = true;
                    gcdReducer = seed;
                }
                else
                {
                    seed = gcd / ++ii;
                }
            } while (!found && (seed > 0));

            if (gcdReducer != 1)
            {
                for (int i = 0; i < newList.Length / 2; i++)
                {
                    newList[i, 0] = newList[i, 0] / gcdReducer;
                    newList[i, 1] = newList[i, 1] / gcdReducer;
                }
            }

            var output = string.Empty;

            for (int i = 0; i < newList.Length / 2; i++)
            {
                output += $"({newList[i, 0]},{newList[i, 1]})";
            }
            return(output);
        }