这道题就是一个递推(或者就是一个类似背包的算法),最后把分解成1~4个平方数的方案数累加即可。
#include<bits/stdc++.h>
using namespace std;
int t,n;
int dp[33000][5];
void Init()
{
dp[0][0] = 1;
for (int i = 1 ; i*i <= 32768 ; i ++)
for (int j = i*i ; j <= 32768 ; j ++)
for (int k = 1 ; k <= 4 ; k ++)
dp[j][k] += dp[j-i*i][k-1];
}
int main()
{
Init();
scanf("%d",&t);
for (int i = 1 ; i <= t ; i ++)
{
scanf("%d",&n);
int ans = dp[n][1]+dp[n][2]+dp[n][3]+dp[n][4];
printf("%d
",ans);
}
return 0;
}