【洛谷】P1586 四方定理

 

这道题就是一个递推(或者就是一个类似背包的算法),最后把分解成1~4个平方数的方案数累加即可。

#include<bits/stdc++.h>
using namespace std;

int t,n;
int dp[33000][5];

void Init()
{
	  dp[0][0] = 1;
	  for (int i = 1 ; i*i <= 32768 ; i ++)
	    for (int j = i*i ; j <= 32768 ; j ++)
	      for (int k = 1 ; k <= 4 ; k ++)
	        dp[j][k] += dp[j-i*i][k-1];
}

int main()
{
	Init();
	scanf("%d",&t);
	for (int i = 1 ; i <= t ; i ++)
	  {
			scanf("%d",&n);
			int ans = dp[n][1]+dp[n][2]+dp[n][3]+dp[n][4];
			printf("%d\n",ans);
	}
	return 0;
}

  

posted @ 2018-06-19 19:05  surpassion  阅读(222)  评论(0编辑  收藏  举报