public class Euler201 {
    public static void main(String[] args) {
        int n = 100, choose = 50;
        int[] values = new int[n];
        for (int i = 0; i < n; i++)
            values[i] = (i + 1) * (i + 1);
        int maxSum = 0;
        for (int i = n - choose; i < n; i++)
            maxSum += values[i];
        int width = maxSum + 1;
        byte[] dp = new byte[(choose + 1) * width];
        dp[0] = 1;
        int[] low = new int[choose + 1], high = new int[choose + 1];
        java.util.Arrays.fill(high, -1);
        high[0] = 0;
        for (int i = 0; i < n; i++) {
            int x = values[i];
            int up = Math.min(choose, i + 1);
            for (int k = up; k >= 1; k--) {
                if (high[k - 1] < 0)
                    continue;
                int start = low[k - 1] + x, end = high[k - 1] + x;
                int basePrev = (k - 1) * width, baseK = k * width;
                for (int s = end; s >= start; s--) {
                    int add = dp[basePrev + s - x] & 0xFF;
                    if (add == 0)
                        continue;
                    int v = (dp[baseK + s] & 0xFF) + add;
                    dp[baseK + s] = (byte) Math.min(v, 2);
                }
                if (high[k] < 0) {
                    low[k] = start;
                    high[k] = end;
                } else {
                    low[k] = Math.min(low[k], start);
                    high[k] = Math.max(high[k], end);
                }
            }
        }
        long ans = 0;
        int base = choose * width;
        for (int s = low[choose]; s <= high[choose]; s++)
            if ((dp[base + s] & 0xFF) == 1)
                ans += s;
        System.out.println(ans);
    }
}
