题目链接:luogu P1586 四方定理
题目大意:
题解:
类似于完全背包,(dp[i][j])代表(i)用(j)个平方数所可以组成的方案数,这样对于一个(n),只要输出(dp[n][1dots4])的和就行了。
状态转移方程:(dp[i][j]+=dp[i−k∗k][j−1])
#include <iostream>
using namespace std;
#define io_speed_up ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N = 32768;
int dp[N + 1][5], t, n, ans;
int main() {
io_speed_up;
dp[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) {
dp[j][k] += dp[j - i * i][k - 1];
}
}
}
cin >> t;
while (t--) {
cin >> n;
ans = 0;
for (int i = 1; i <= 4; ++i) {
ans += dp[n][i];
}
cout << ans << endl;
}
return 0;
}