国10平方拆分、数正方形
一、平方拆分
import java.util.Scanner;public class Main {public static int num=0; // 全局计数器,记录拆分方法数// 深度优先搜索函数// x: 剩余需要拆分的数值// y: 当前允许使用的最小平方数的底数(确保不重复使用平方数)public static void dfs(int x, int y) {if(x < 0) { // 如果剩余数值小于0,说明当前组合不合法return;}else if(x == 0) { // 如果剩余数值等于0,说明找到了一个有效组合num++; // 计数器加1return;}// 尝试使用从y到44的每个平方数for(int i = y; i <= 44; i++) {dfs(x - i*i, i + 1); // 递归搜索,剩余数值减少i²,下一层最小底数为i+1}}public static void main(String[] args) {dfs(2019, 1); // 从数值2019开始搜索,初始最小底数为1System.out.println(num);}
}
二、数正方形
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sn = new Scanner(System.in);int n = sn.nextInt() - 1;long count = 0;long num = 1000000007;//平放// a 表示正方形边长for (int a = 1; a <= n; a++) {count += (n - a + 1) * (n - a + 1);count%=num;}// 斜放//i+j=斜正方形所占区域的边长=平放正方形的边长//但i+j>=2,也就是平放正方形的边长从2开始for (int i = 1; i <= n - 1; i++) {for (int j = 1; j <= n - i; j++) {count += (n - (i + j) + 1) * (n - (i + j) + 1);count%=num;}}System.out.println(count);}
}
背下来