闲来无事想起了洛谷,打卡签到刷他几个题再说,殊不知这是杯具的开始~~
P5534是一个弱智题,入门级别,只需要知道下面公式即可,而且还不止一个公式。 下面是我用的公式(高中的感觉真让人怀念啊~~): 看题: 题目描述
小 X 给了你一个等差数列的前两项以及项数,请你求出这个等差数列各项之和。
等差数列:对于一个 n项数列 a,如果满足对于任意 i∈[1,n),有 ai+1−ai=d,其中 d 为定值,则称这个数列为一个等差数列。 输入格式
一行 3个整数 a1,a2,n,表示等差数列的第 1,2 项以及项数。
数据范围:
∣a1∣,∣a2∣≤10^6
。 3≤n≤10^6
。
输出格式
一行一个整数,表示答案。 输入输出样例 输入 #1
1 2 3
输出 #1
6
输入 #2
-5 -10 5
输出 #2
-75
说明/提示
【样例 1 说明】
这个等差数列为 1 2 3
,其各项之和为 6
。
我是用Java写的:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a1 = scanner.nextInt();
int a2 = scanner.nextInt();
int num = scanner.nextInt();
int d = a2 - a1;
System.out.println(num*a1 + num*(num-1)*d/2);
scanner.close();
}
}
然后一般小白看来肯定OK是吧,提交以后我傻了: 这都是啥? 冥思苦想很久,大胆地做了一个很极限的测试:
-99999 99999 99999
结果是悲壮的:
-2137671075
这是啥? 我恍然大悟——溢出了。。。 那就换long呗?毕竟测试数据不超过100000。。。 一篇感人至深的code诞生了:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long a1 = scanner.nextLong();
long a2 = scanner.nextLong();
long num = scanner.nextLong();
long d = a2 - a1;
System.out.println(num*a1 + num*(num-1)*d/2);
scanner.close();
}
}
运行上面的测试用例:
999950000699997
很棒,然后: 终于AC了,痛哭流涕~~ 以后要多做OJ,避免自己成为能写系统却不能做OJ的菜鸡~~~