等差数列求和模板

一直就没彻底搞清楚这个问题。 在这里总结下。

一、1+2+3+4+...+n

这个公式还是记得住的:n*(n+1)/2 (编程的时候顺序不能变)

二、起始项为a1,终止项为an,总共有n项

这时候分情况讨论

1. n%2 == 0

则输出 (a1+an)*(n/2)

2. n%2 == 1

定理:当n%2==1时,(a1+an)%2 == 0

证明:

an = a1 + (n-1)*d

a1+an = 2*a1+(n-1)*d

所以(a1+an)%2 == 0

有了这个定理,于是输出((a1+an)/2)*n

这样一来,虽然有除法,但是取模也很方便了.

//等差数列求和模板,[a1,a1+d,...,an]
long long allsum(long long a1,long long an,long long n)
{
    if(n%2==0)
        return (a1+an)*(n/2);
    else return ((a1+an)/2)*n;
}
时间: 2024-12-15 07:16:19

等差数列求和模板的相关文章

[C/E] 等差数列求和

题目:要求给定一个整数 N,求从 0 到 N 之间所有整数相加之和. 解1:使用 for 循环依次递加. #include <stdio.h> int main(void){ int x; printf("Input an integer:\n"); scanf("%d", &x); printf("sum=%d\n", sum(x)); return 0; }; int sum(int x){ int i, result=0

hdu2058 The sum problem(枚举~~等差数列求和公式)

The sum problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17697    Accepted Submission(s): 5275 Problem Description Given a sequence 1,2,3,......N, your job is to calculate all the possibl

树链剖分+线段树 单点修改 区间求和 模板

马上要去西安打邀请赛了,存下板子 首先是vector存图的: #include<bits/stdc++.h> using namespace std; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define mid int m = (l + r) >> 1 const int M = 2e5+10; int fa[M],dep[M],siz[M],son[M

bzoj2154(莫比乌斯反演)

又是一道经典题. 学习了下O(n) 的做法. // // main.cpp // bzoj2154 // // Created by New_Life on 16/7/7. // Copyright © 2016年 chenhuan001. All rights reserved. // #include <iostream> #include <string.h> #include <stdio.h> using namespace std; #define N 10

高斯求和等差数列前缀和(洛谷1147 连续自然数和)

对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一

C++中的数据类模板

1,预备知识: 1,模板参数可以是数值型参数(非类型参数): 1,代码示例: 1 template <typename T, int N> 2 void func() 3 { 4 T a[N]; // 使用模板参数定义局部数组: 5 } 6 7 func<double, 10>(); // 使用模板时,数值型参数必须是常量,不能是变量: 2,数值型模板参数的限制: 1,变量不能作为模板参数: 1,是变量的话就不满足准确确定的这个本质: 2,浮点数不能作为模板参数: 1,浮点数本身不

树状数组模板(改点求段 / 该段求点 / 改段求段)

1. 改点求段(单点更新, 区间求和) 代码: 1 #include <iostream> 2 using namespace std; 3 4 const int MAXN = 1e5 + 10; 5 int tree[MAXN], n; 6 7 int lowbit(int x){//返回 pow(2, k),其中k为末尾0的个数, 即返回最低位1的值 8 return x & -x; 9 } 10 11 void add(int x, int d){//将d累加到tree数组对应

洛谷 P1147 连续自然数和 Label:等差数列

题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定

poj 2140 Herd Sums(等差数列)

题目链接:http://poj.org/problem?id=2140 题意:给出n,求一共有多少个连续的数满足加和恰好得到n, 思路:这题想了好久一开始以为是打表找规律,后来才发现与等差数列有关...(这题也可以用DP来做) 根据等差数列求和公式S=(a1+an)*n/2和末项公式an=a1+(n-1)*d(d位公差)得a1=(2*s+n-n*n)/2/n;得出求a1的公式然后对所有的n(n为项数)进行枚举,得出结果 2*s=(2*a1+n-1)*n,因为2*S必为偶数所以n为偶数或者(2*a