题目传送门
解题思路:
f[i][j]表示数i被j个数构成的方案数,然后就跟完全背包差不多了
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int t,n = 32768,f[32800][5]; 7 8 int main() { 9 f[0][0] = 1; 10 for(int i = 1;i * i <= n; i++) 11 for(int j = i * i;j <= n; j++) 12 for(int k = 1;k <= 4; k++) 13 f[j][k] += f[j-i*i][k-1]; 14 scanf("%d",&t); 15 while(t--) { 16 scanf("%d",&n); 17 int ans = 0; 18 for(int i = 1;i <= 4; i++) 19 ans += f[n][i]; 20 printf("%d ",ans); 21 } 22 return 0; 23 }