uva10177

 题目大意:

给你二维三维四维表面都是方格,方格都是1×1的,给你n,代表n×n,3维就是n×n×n。。。。。

让你求出有多少正方形,长方形(二维), 立方体,长方体(3维)。。。。。

 

算法分析:

其实就是公式推导。

以二维为例,你要先能求出矩形的个数(包含正方形),其实很好求,就是每条边任意取两条线,这两条线一定能组成一个矩形(当然也可能是正方形,正方形也是矩形)。

所以矩形的个数就是就是(n+1)中取2的组合数的平方,也就是(n+1)* n/2 的平方,那么3维也就是3次方,四维就是4次方。。。。矩形搞定了。那么再求出方形的,减一下就能求出纯矩形了。

 

方形也很好算:1×1的肯定有n×n个,2×2的就有(n-1)*(n-1)个。。。。。。。n×n的只有1个,就是平方和公式啦。

同理三维就是立方和公式啦

四维就是4次方求和(从1到n的四次方和公式)

 

直接给代码包含一些公式的推导啊:

//平方和公式
//(利用恒等式(n+1)^3=n^3+3n^2+3n+1):
//  (n+1)^3-n^3=3n^2+3n+1, 
//    n^3-(n-1)^3=3(n-1)^2+3(n-1)+1 
//	  .............................. 
//	    3^3-2^3=3*(2^2)+3*2+1 
//		  2^3-1^3=3*(1^2)+3*1+1. 
//		    把这n个等式两端分别相加,得: 
//			  (n+1)^3-1=3(1^2+2^2+3^2+....+n^2)+3(1+2+3+...+n)+n, 
//			    由于1+2+3+...+n=(n+1)n/2, 
//				  代人上式得: 
//				    n^3+3n^2+3n=3(1^2+2^2+3^2+....+n^2)+3(n+1)n/2+n 
//					  整理后得: 
//					    1^2+2^2+3^2+....+n^2=n(n+1)(2n+1)/6 

//立方和
//1^3+2^3+3^3+……+n^3=[n(n+1)/2]^2 
//证明:
//(n+1)^4-n^4=[(n+1)^2+n^2][(n+1)^2-n^2] 
//=(2n^2+2n+1)(2n+1) 
//=4n^3+6n^2+4n+1 
//
//2^4-1^4=4*1^3+6*1^2+4*1+1 
//3^4-2^4=4*2^3+6*2^2+4*2+1 
//4^4-3^4=4*3^3+6*3^2+4*3+1 
//...... 
//(n+1)^4-n^4=4*n^3+6*n^2+4*n+1 
//
//各式相加有 
//(n+1)^4-1=4*(1^3+2^3+3^3...+n^3)+6*(1^2+2^2+...+n^2)+4*(1+2+3+...+n)+n 
//
//4*(1^3+2^3+3^3+...+n^3)=(n+1)^4-1+6*[n(n+1)(2n+1)/6]+4*[(1+n)n/2]+n=[n(n+1)]^2 
//
//1^3+2^3+...+n^3=[n(n+1)/2]^2

//四次方和公式
//令n的k次方表示为n^k,令*表示乘法。
//如下举例说明N方和求和方法。
//F(n)=1^4+2^4+…+n^4
//F(n)=(1^3+2^3+…+n^3)n-{1^3+(1^3+2^3)+…[1^3+2^3+…(n-1) ^3]}
//F(n)=[n^2*(n+1) ^2]/4-[(1*2)^2+(2*3)^2+…+(n-1) ^2*n^2]
//令h(n)=n^2*(n+1) ^2#
//h(n)+h(n-1)=2n^4+2n^2@1
//…
//h(2)+h(1)=2*2^4+2*2^2@n-1
//以上@1到@n-1求和。
//h(n)+2[h(n-1)+…+h(2)]+h(1)=2[F(n)-1]+2[1^2+2^2+…+n^2-1]
//[h(n-1)+…+h(2)+h(1)]=[F(n)-1]+(1^2+2^2+…+n^2-1)+[h(1)-h(n)]/2
//此式代入#可求得。F(n)=(6n^5+15n^4+10n^3-n)/30


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
	long long N;
	long long s2,r2,s3,r3,s4,r4;
	while (scanf("%lld", &N) != EOF)
	{
		s2 = N * (N + 1) * (2 * N + 1) / 6;//正方形的个数就是2维,平方求和,3维,3次方求和,4维,四次方求和
		r2 = (N + 1) * N * N * (N + 1) /4;//每个面取两条线,然后就能得到所有矩形的数(包括正方形)(n+1)取2的组合数,有几个面相乘几次,下同
		s3 = r2;
		r3 = (N + 1) * N * N * (N + 1) * N * (N + 1) / 8;
		s4 = (6*N*N*N*N*N + 15*N*N*N*N + 10*N*N*N - N) / 30;
		r4 = (N + 1) * N * N * (N + 1) * N * (N + 1) * N * (N + 1)/16;

		printf("%lld %lld %lld %lld %lld %lld\n",s2, r2 - s2, s3, r3 - s3, s4, r4 - s4);
	}
	return 0;
}


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值