题解 CF675A 【Infinite Sequence】
TRZ_2007
2020-08-08 16:55:13
[题解 CF675A 【Infinite Sequence】](https://www.luogu.com.cn/problem/CF675A)
# Description
给出三个整数 $a$ , $b$ ,$c$,求 $b$ 是否在以 $a$ 为第一个数,公差为 $c$ 的等差数列中。
# Solution
实际上这道题木不知特别的难,只要你明白**等差数列**是什么。
等差数列由一组无穷无尽的的数字组成,拥有首项和公差,比如一个首项为 22 ,公差为 2 的等差数列长这个样子:
$$22,24,26,28,30,\dots$$
用集合来表示就是这样的:
$$A={22+2k,k \in Z^+}$$
(大括号被Latex吃掉了)
所以说等差数列的项都是 $a+dk$,其中 $a$ 时是首项,$d$ 是公差,$k$ 是大于零的整数。
对于这道题目,我们来分类讨论:
- 1:当 $c > 0$ 时
如果数字 $b$ 在以 $a$ 为第一个数,公差为 $c$ 的等差数列中,那么有 $a+ck=b$,解得 $k=\frac{b-a}{c}$,其中 $k\in Z^+$。
解个方程判断一下就可以了。
- 2:当 $c = 0$时
如果数字 $b$ 在以 $a$ 为第一个数,公差为 $c$ 的等差数列中,那么有 $a = b$。
判断一下就好了。
- 3:当 $c < 0$时
把第一种情况反过来做就好了。
# Code
```cpp
#include <bits/stdc++.h>
using namespace std;
int a,b,c;
int pos;
int main() {
scanf("%d %d %d",&a,&b,&c);
if(c == 0) { // 公差为0
if(a == b) puts("YES");
else puts("NO");
}else {
if(c > 0) { //公差大于0
if(b < a) puts("NO"); //因为k>0,所以如果b小于a,则不可能达到b
else {
if((b - a) % c == 0) puts("YES"); //通过我们之前的出来的
else puts("NO");
}
}else { //就是把分类讨论1当中全部反过来
if(b > a) puts("NO");
else {
c = abs(c);
if((a - b) % c == 0) puts("YES");
else puts("NO");
}
}
}
return 0;
}
```