P1586 四方定理

题目描述

四方定理是众所周知的:任意一个正整数nn ,可以分解为不超过四个整数的平方和。例如:25=1^{2}+2^{2}+2^{2}+4^{2}25=12+22+22+42 ,当然还有其他的分解方案,25=4^{2}+3^{2}25=42+32 和25=5^{2}25=52 。给定的正整数nn ,编程统计它能分解的方案总数。注意:25=4^{2}+3^{2}25=42+32 和25=3^{2}+4^{2}25=32+42 视为一种方案。

输入输出格式

输入格式:

第一行为正整数tt (tle 100t100 ),接下来tt 行,每行一个正整数nn (nle 32768n32768 )。

输出格式:

对于每个正整数nn ,输出方案总数。

输入输出样例

输入样例#1: 复制
1
2003
输出样例#1: 复制
48

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c)
{
    return min(min(a, b), c);
}
template <class T> inline T max(T a, T b, T c)
{
    return max(max(a, b), c);
}
template <class T> inline T min(T a, T b, T c, T d)
{
    return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d)
{
    return max(max(a, b), max(c, d));
}
#define scanf1(x) scanf("%d", &x)
#define scanf2(x, y) scanf("%d%d", &x, &y)
#define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********
");
#define mp make_pair
#define pb push_back
const int maxn = 10005;
// name*******************************
int f[33000][10];
int t;
int n=32768;
int ans=0;
// function******************************



//***************************************
int main()
{
//    ios::sync_with_stdio(0);
//    cin.tie(0);
//    freopen("test.txt", "r", stdin);
    //  freopen("outout.txt","w",stdout);
    me(f,0);
    f[0][0]=1;
    for(int i=1; i*i<=n; i++)
        for(int j=i*i; j<=n; j++)
            for(int k=1; k<=4; k++)
                f[j][k]+=f[j-i*i][k-1];

    cin>>t;
    while(t--)
    {
        ans=0;
        cin>>n;
        For(i,1,4)
        ans+=f[n][i];
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/planche/p/8650454.html