public class ExactTree { int calc(int n, int n1, int s1, int n2, int s2) { return s1 + s2 + n1 * (n - n1); } public int getTree(int n, int m, int r) { int[][] dp = new int[n+1][m]; for(int i = 1; i <= n; i++) for(int j = 0; j < m; j++) dp[i][j] = -1; dp[1][0] = 0; for(int s = 2; s <= n; s ++) for(int a = 1; a < s; a ++) for(int m1 = 0; m1 < m; m1 ++) for(int m2 = 0; m2 < m; m2 ++) { int b = s - a; if(dp[a][m1] == -1) continue; if(dp[b][m2] == -1) continue; int v = calc(n, a, dp[a][m1], b, dp[b][m2]); if(dp[s][v%m] == -1 || dp[s][v%m] > v) dp[s][v%m] = v; } return dp[n][r]; } }