luogu P1586 四方定理

题目链接: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;
}
原文地址:https://www.cnblogs.com/IzumiSagiri/p/14020029.html