Voldemort's blog

Voldemort's blog

我好菜啊

题解 CF675A 【Infinite Sequence】

posted on 2020-08-08 16:55:13 | under 题解 |

题解 CF675A 【Infinite Sequence】

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

#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;
}