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); }
/// <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[, ]); }
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]); }
private CounterCollection(long[,] counters, long[,] durations, CounterCollection parent) { m_counters = (long[, ])counters.Clone(); m_durations = (long[, ])durations.Clone(); m_parent = parent; }
public Matrix(long[,] grid) { this.grid = (long[, ]) grid.Clone(); }
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); }