找工作刷题记录_030翻转数列

C/c++中 int、long、long long等取值范围

unsigned   int   0~4294967295   
int   -2147483648~2147483647 
unsigned long 0~4294967295
long   -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615  //20位

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为'-';。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。

输入描述:

输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。

输出描述:

输出一个整数, 表示前n项和。

示例1

输入

8 2

输出

8
#include<iostream>
using namespace std;
//typedef long long LL;
int main(){
    //LL n,m;
    long n,m;
    cin >> n >> m;
    cout << (n*m)/2 <<endl;      
}

思路:观察数列,我们可以将一组负正的数出现(如-1,-2,3,4)看做一组,则n个数一共有n/(2m)组,而每一组求和结果为m*m,于是得到前n项和公式为Sn = n*m*m/2m = m*n/2。数学题,注意样例的取值范围long、float、int等等。

猜你喜欢

转载自blog.csdn.net/qq_23565519/article/details/89034876