小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。