相当于背包,
f[i][j] 表示当前数为 i,能分解成 j 个数的平方的和的数量
那么就是统计背包装物品的数量
——代码
#include <cmath> #include <cstdio> #include <iostream> #define max(x, y) ((x) > (y) ? (x) : (y)) int t, n, m, sum; int a[101], f[100001][5]; inline int read() { int x = 0, f = 1; char ch = getchar(); for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; return x * f; } int main() { int i, j, k; t = read(); for(i = 1; i <= t; i++) { a[i] = read(); n = max(n, a[i]); } f[0][0] = 1; m = sqrt(n); for(i = 1; i <= m; i++) for(j = i * i; j <= n; j++) for(k = 1; k <= 4; k++) f[j][k] += f[j - i * i][k - 1]; for(i = 1; i <= t; i++) { sum = 0; for(j = 1; j <= 4; j++) sum += f[a[i]][j]; printf("%d ", sum); } return 0; }