PRE_SUM = [0] * 1001# 预处理 for i inrange(1, 1001): s = str(i * i) n = len(s) defdfs(p: int, sum: int) -> bool: if p == n: # 递归终点 returnsum == i # i 符合要求 x = 0 for j inrange(p, n): # 从 s[p] 到 s[j] 组成的子串 x = x * 10 + int(s[j]) # 对应的整数值 if dfs(j + 1, sum + x): returnTrue returnFalse PRE_SUM[i] = PRE_SUM[i - 1] + (i * i if dfs(0, 0) else0)
static { for (inti=1; i <= 1000; i++) { vars= Integer.toString(i * i).toCharArray(); PRE_SUM[i] = PRE_SUM[i - 1] + (dfs(s, i, 0, 0) ? i * i : 0); } }
privatestaticbooleandfs(char[] s, int i, int p, int sum) { if (p == s.length) // 递归终点 return sum == i; // i 符合要求 intx=0; for (intj= p; j < s.length; j++) { // 从 s[p] 到 s[j] 组成的子串 x = x * 10 + s[j] - '0'; // 对应的整数值 if (dfs(s, i, j + 1, sum + x)) returntrue; } returnfalse; }
funcinit() { // 预处理 for i := 1; i <= 1000; i++ { s := strconv.Itoa(i * i) n := len(s) var dfs func(int, int)bool dfs = func(p, sum int)bool { if p == n { // 递归终点 return sum == i // i 符合要求 } x := 0 for j := p; j < n; j++ { // 从 s[p] 到 s[j] 组成的子串 x = x*10 + int(s[j]-'0') // 对应的整数值 if dfs(j+1, sum+x) { returntrue } } returnfalse } preSum[i] = preSum[i-1] if dfs(0, 0) { // i 符合要求 preSum[i] += i * i // 计算前缀和 } } }