luogu P1586 四方定理
题目链接:luogu P1586 四方定理
题目大意:
题解:
类似于完全背包,\(dp[i][j]\)代表\(i\)用\(j\)个平方数所可以组成的方案数,这样对于一个\(n\),只要输出\(dp[n][1\dots4]\)的和就行了。
状态转移方程:\(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;
}