首页 > 代码库 > 【HDU2007】平方和与立方和
【HDU2007】平方和与立方和
http://acm.hdu.edu.cn/showproblem.php?pid=2007
垃圾水题
随便搜了几个公式(但我实际写的暴力。。。题目保证不爆int,说明n,m<=10^3)
1^2+2^2+3^2+...+n^2
利用立方差公式
n^3-(n-1)^3=1*[n^2+(n-1)^2+n(n-1)]
=n^2+(n-1)^2+n^2-n
=2*n^2+(n-1)^2-n
2^3-1^3=2*2^2+1^2-2
3^3-2^3=2*3^2+2^2-3
4^3-3^3=2*4^2+3^2-4
.
n^3-(n-1)^3=2*n^2+(n-1)^2-n
各等式全相加
n^3-1^3=2*(2^2+3^2+...+n^2)+[1^2+2^2+...+(n-1)^2]-(2+3+4+...+n)
n^3-1=2*(1^2+2^2+3^2+...+n^2)-2+[1^2+2^2+...+(n-1)^2+n^2]-n^2-(2+3+4+...+n)
n^3-1=3*(1^2+2^2+3^2+...+n^2)-2-n^2-(1+2+3+...+n)+1
n^3-1=3(1^2+2^2+...+n^2)-1-n^2-n(n+1)/2
3(1^2+2^2+...+n^2)=n^3+n^2+n(n+1)/2=(n/2)(2n^2+2n+n+1)
=(n/2)(n+1)(2n+1)
1^2+2^2+3^2+...+n^2=n(n+1)(2n+1)/6
另外一个很好玩的做法
想像一个有圆圈构成的正三角形,
第一行1个圈,圈内的数字为1
第二行2个圈,圈内的数字都为2,
以此类推
第n行n个圈,圈内的数字都为n,
我们要求的平方和,就转化为了求这个三角形所有圈内数字的和.设这个数为r
下面将这个三角形顺时针旋转60度,得到第二个三角形
再将第二个三角形顺时针旋转60度,得到第三个三角形
然后,将这三个三角形对应的圆圈内的数字相加,
我们神奇的发现所有圈内的数字都变成了2n+1
而总共有几个圈呢,这是一个简单的等差数列求和
1+2+……+n=n(n+1)/2
于是3r=[n(n+1)/2]*(2n+1)
r=n(n+1)(2n+1)/6
1^2+2^2+···n^2=1/6*n*(n+1)*(2n+1);
1^2+2^2+···(2n)^2=1/6*2n*(2n+1)*(4n+1);
2^2+4^2+6^2+···+(2n)^2=4*(1^2+2^2+···+n^2)=4*1/6*n*(n+1)*(2n+1);
1^2+3^2+···+(2n-1)^2=1/6*2n*(2n+1)*(4n+1)-4*1/6*n*(n+1)*(2n+1);
code
// <2007.cpp> - 11/17/16 08:40:30// This file is made by YJinpeng,created by XuYike‘s black technology automatically.// Copyright (C) 2016 ChangJun High School, Inc.// I don‘t know what this program is.#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <cstdlib>#include <cmath>using namespace std;typedef long long LL;int main(){ freopen("2007.in","r",stdin); freopen("2007.out","w",stdout); int n,m; while(~scanf("%d%d",&n,&m)){ if(n>m)swap(n,m); LL ans1=0,ans2=0; for(LL i=n;i<=m;i++) if(i&1)ans1+=i*i*i; else ans2+=i*i; printf("%lld %lld\n",ans2,ans1); } return 0;}
【HDU2007】平方和与立方和