求前 n 个正整数的 k 次方和

如何推导求和公式

\( 1^2+2^2+3^2+\cdots+n^2=\frac{n(n+1)(2n+1)}{6} \)

\( 1^3+2^3+3^3+\cdots+n^3=\frac{n^2(n+1)^2}{4} \)

呢?这需要一点技巧。

首先来看一个恒等式:

\( (n+1)^3-n^3 = 3n^2+3n+1 \)

\( n^2=\frac{1}{3}\left [ (n+1)^3-n^3-(3n+1) \right ] \)

对上式求和,\( (n+1)^3-n^3 \) 会只剩首尾两项(中间的消掉了),\( 3n+1 \) 是等差数列,求和公式已知。这样就能求出二次方的求和公式。用同样的方法,可以推出三次方的求和公式:

\( (n+1)^4 - n^4 = 4n^3 + 6n^2 + 4n + 1 \)

\( n^3 = \frac{1}{4}\left [ (n+1)^4 - n^4 - (6n^2+4n+1) \right ] \)

对上式求和,\( (n+1)^4 - n^4 \) 会只剩首尾两项,\( 6n^2 \) 和 \( 4n+1 \) 求和公式已知(前者可以用上面推导的二次方的求和公式,后者是等差数列。这样就能推出三次方的求和公式。一直这样递推下去就能得到各次的求和公式。

时间: 2024-11-13 11:50:05

求前 n 个正整数的 k 次方和的相关文章

算法导论学习之线性时间求第k小元素+堆思想求前k大元素

对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思路例如以下: 1.分解:将A[p,r]分解成A[p,q-1]和A[q+1,r]两部分.使得A[p,q-1]都小于A[q],A[q+1,r]都不小于A[q]; 2.求解:假设A[q]恰好是第k小元素直接返回,假设第k小元素落在前半区间就到A[p,q-1]递归查找.否则到A[q+1,r]中递归查找. 3

ZOJ 3774 Fibonacci的K次方和

In mathematics, Fibonacci numbers or Fibonacci series or Fibonacci sequence are the numbers of the following integer sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ... By definition, the first two numbers in the Fibonacci sequence are

利用数组求前n个质数

我的算法思想和实现方式都在代码和注释当中呢,这样的方式确实使算法复杂度降低一个等级,很好啊. #include <stdio.h> #include <time.h> /** * 利用数组求前n个质数 * 确定一个数m是否为质数,可以用已求出的质数对m * 的整除性来确定 */ //如果不知道质数的特性和想不到优化思路的方法 void getNPrimes_normal(); //优化之后的方法 void getNPrimes_optimize(); int main(void)

POJ 2828 poj 2828 Buy Tickets 【树状数组,已知前n项和为K,返回n值】

题目链接:http://poj.org/problem?id=2828 在一个队列中,一个人想要插队,告诉你每个新来的人会插在i个人后面,求出最后的队列. 如果我们用模拟的话,那么时间复杂度肯定是超了:想想,如果我们逆序,那么最后来的人的位置一定是固定的,这样的话,我们将问题转化成逆序扫描给出数据,插在i个人后面这个数据就变成了在这个人前面需要留出多少个空位.如此我们只需要用树状数组记录前n项总共有多少个空位,每扫描一个数据,就找出能使得他前面正好有i个空位. 这题用树状数组或者线段树都可以,今

hdu 2200 Eddy&#39;s AC难题 (排列组合 就是求(a+b)的n次方的展开式)

Eddy's AC难题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3770    Accepted Submission(s): 1765 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的

求出所有的正整数对 使他们最大公约数为n,最小公倍数为m

题目大概是这样的:点击打开链接 大意就是 求出所有的正整数对 使他们最大公约数为n,最小公倍数为m.(1 <= n, m <= 10^10) 可以将问题转化为 : 设a,b就是那个整数对,n, a, b, m, 这4个数都是可以被n整除的,可以都除以n, 题目转化为求出 最大公约数为1, 最小公倍数为m/n的对数 . 也就是求出在1到m/n里 乘积为m/n且互质的对数.可以在O(sqrt (m/n) )内解决. #include <algorithm> #include <c

实现n的k次方

#include<stdio.h>int main(){ double function(int n, int k); int a = 0; int b = 0; double c = 0; scanf("%d %d", &a, &b); c = function(a, b); printf("%lf\n", c); system("pause"); return 0;} double function(int n,

_DataStructure_C_Impl:在图G中求距离顶点v0最短路径为k的所有顶点

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define MaxSize 50 //最大顶点个数 typedef enum{DG,DN,UG,UN}GraphKind; //边结点的类型定义 typedef struct ArcNode{ int adjvex;

阶乘之和 输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤10 6 ,n!表示 前n个正整数之积。

阶乘之和输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0).n≤10 6 ,n!表示前n个正整数之积.样例输入:10样例输出: package demo; import java.util.Scanner; public class demo02 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); long sum=0; for (int