小Q定义了一种数列称为翻转数列:
给定整数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项和。
8 2
8
/*** 思路: 单纯数学规律,从第一个数字开始,每 2m 个数字之和为 m^2,总共有 n/2m 个这样的组合,因此和为 m*n/2*/import java.util.*;public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);longn = sc.nextLong();longm = sc.nextLong();System.out.println(process(n, m));}public static long process(long n, long m){if(n % (2* m) != 0)return-1;return m * (n / 2);}}
import sys def reverseSum(n, m): a, sign, number, ans, tempSum = n // m, -1, 1, 0, 0 for i in range(a): tempSum = (2*number + m - 1)*m//2 number += m ans += tempSum * sign tempSum = 0 sign *= -1 return ans if __name__ == "__main__": line = sys.stdin.readline().strip() values = list(map(int, line.split())) print(reverseSum(values[0], values[1]))
#include<iostream>
using namespace std;
int main()
{
long long n, m;
cin >> n >> m;
cout<<n*m/2<<endl;
}
编程模拟解答: #include<iostream>
using namespace std;
int main(){
long long n,m;
cin>>n>>m;
long long sum = 0;
for(int i=1;i<=n;i++){
sum += i;
}
int j = 0;//(j为组数,从零开始)
while(m+j*m <= n){//1+j*m到m+j*m的数字为一组
for(long long i=1+j*m;i<=m+j*m;i++)//每一轮都要从中减去一组
sum -= 2*i;//总和相当于前n项和加上了2倍的i,所以减去2倍的i
j+=2;//只需要减去偶数组
}
cout<<sum;
return 0;
} #include <stdio.h>
int main()
{
long long m,n;
scanf("%lld%lld",&n,&m);
printf("%lld\n",n/2*m);
return 0;
} n,m = map(int, input().split()) print(m*n//2) # 由 (1+n)*n//2-(1+n-m)*n//2 简化得出
n,m = map(int,input().strip().split()) print(m**2*(n//(2*m)))
#include<iostream>
usingnamespacestd;
longnumSum(doublen,doublem){
return(double)(n/2/m)*m*m;
}
intmain(){
doublen,m;
while(cin>>n>>m){
cout<<numSum(n,m);
}
return0;
} import java.util.*;
public class Main {
public static void main(String args []) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
int m = sc.nextInt();
// 记录正反
boolean tag = false;
long count = 0;
for (long i = 1; i <= n; i++) {
// 每 m 次反转
if (i % m == 0) {
tag = !tag;
}
if (tag) {
count += i;
} else {
count -= i;
}
}
System.out.println(count);
}
}
import java.util.*;
public class Main {
public static void main(String args []) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
int m = sc.nextInt();
System.out.println((n / (m << 1)) * (m * m));
}
}
import java.math.BigDecimal;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan= new Scanner(System.in);
while(scan.hasNext()){
int num=scan.nextInt();
int param=scan.nextInt();
BigDecimal count=new BigDecimal(0);
int[] array= new int[2*param];
for (int i = 0; i <2*param; i++) {
if(i<param){
array[i]=-(i+1);
}else{
array[i]=i+1;
}
count= count.add(new BigDecimal(array[i]));
}
System.out.println(count.multiply(new BigDecimal(num/(2*param))));
}
}
}
每2m个数值加起来和一致,所以只考虑前2m个数值就可以然后乘以n/2m。