四方定理
题目描述:
四方定理是众所周知的:任意一个正整数$n$,可以分解为不超过四个整数的平方和。例如:,当然还有其他的分解方案:和。给定的正整数,编程统计它能分解的方案总数。注意:和视为一种方案。
输入格式
第一行为正整数(),接下来行,每行一个正整数()。
输出格式
对于每个正整数,输出方案总数。
样例 1
样例输入1
1
2003
样例输出 1
48
代码以及思路:
#include<iostream>
using namespace std;
inline int read()
{
char ch;
int res=0;
while(ch=getchar(),ch<'0'||ch>'9');
res=ch-48;
while(ch=getchar(),ch>='0'&&ch<='9')
res=(res<<3)+(res<<1)+ch-48;
return res;
}
inline void print(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10)print(x/10);
putchar(x%10+'0');
return;
}
//快读和快写
//----------------------------------------------
int f[40005][5]={1};
//f[i][j]表示数字i可以被分成j个平方数
inline void all_prime()
{
for(int i=1;i*i<=40000;i++)//新添加的平方数
for(int j=i*i;j<=40000;j++)//可以组成的平方数
for(int k=1;k<=4;k++)//平方数的个数
f[j][k]+=f[j-i*i][k-1];
/*
k个平方数组成数j有f[j][k]种方案数
它要加上f[j-i*i][k-1]的方案数
因为i*i是一个平方数,所以j-i*i可以被分成k-1 个平方数
*/
}
signed main()
{
all_prime();
int t=read();
while(t--)
{
int n=read();
int sum=0;
for(int i=1;i<=4;i++)
sum+=f[n][i];//直接累加方案数
print(sum);
printf("\n");//记得换行!!!!
}
return 0;//完结撒花!!!!
}