public class Solution {
    private static TValue GetOrDefault<TKey, TValue>(Dictionary<TKey, TValue> map, TKey key, TValue defaultValue) {
        if (map.TryGetValue(key, out var value)) {
            return value;
        }
        return defaultValue;
    }

    public int NumberOfArithmeticSlices(int[] nums) {
        var n = nums.Length;
        var total = 0;

        var dp = new Dictionary<long, int>[n];
        for (var i = 0; i < n; ++i) {
            dp[i] = new Dictionary<long, int>();
        }

        for (var i = 1; i < n; ++i) {
            for (var j = 0; j < i; ++j) {
                var diff = (long)nums[i] - nums[j];

                if (diff < int.MinValue || diff > int.MaxValue) {
                    continue;
                }

                int count = GetOrDefault(dp[j], diff, 0);

                total += count;
                dp[i][diff] = 1 + count + GetOrDefault(dp[i], diff, 0);
            }
        }

        return total;
    }
}