[luoguP1586] 四方定理(DP 背包)

传送门

 

相当于背包,

f[i][j] 表示当前数为 i,能分解成 j 个数的平方的和的数量

那么就是统计背包装物品的数量

 

——代码

#include <cmath>
#include <cstdio>
#include <iostream>
#define max(x, y) ((x) > (y) ? (x) : (y))

int t, n, m, sum;
int a[101], f[100001][5];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
	return x * f;
}

int main()
{
	int i, j, k;
	t = read();
	for(i = 1; i <= t; i++)
	{
		a[i] = read();
		n = max(n, a[i]);
	}
	f[0][0] = 1;
	m = sqrt(n);
	for(i = 1; i <= m; i++)
		for(j = i * i; j <= n; j++)
			for(k = 1; k <= 4; k++)
				f[j][k] += f[j - i * i][k - 1];
	for(i = 1; i <= t; i++)
	{
		sum = 0;
		for(j = 1; j <= 4; j++) sum += f[a[i]][j];
		printf("%d\n", sum);
	}
	return 0;
}

  

 

posted @ 2017-06-20 11:00  zht467  阅读(115)  评论(0)    收藏  举报