题解:dp
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int f[5][10005];//前i块草皮构成j的方案数
int main()
{
cin>>n;
f[0][0]=1;
for(int i=1;i<=4;i++)
for(int j=1;j<=n;j++)
for(int k=0;k*k<=j;k++)//枚举正方形边长
f[i][j]+=f[i-1][j-k*k];
cout<<f[4][n]+f[3][n]+f[2][n]+f[1][n]<<endl;
}