题解 CF675A 【Infinite Sequence】

TRZ_2007

2020-08-08 16:55:13

Solution

[题解 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; } ```