跳转至

上海计算机学会2023年12月月赛C++丙组T3数轴旅行

keywords: 数学

题目链接

数轴旅行

题目描述

初始位于数轴原点,有 n 个数,表示每次可以向左或者向右移动 �� 步,移动步数不限。即,可以向左连续移动 3 个 �� 步,再向右移动 1 个 �� 步。问最终,是否可以落到坐标 d 上

解题思路

题面描述没有说 �� 只能走一步,但读题看起来是走一步的样子。但是样例分析,“向左走两次6,再向右走一次8”,这就说明,可以随便走。如果用模拟的话,那时间复杂度是比指数级别还大的,无法通过此题。 把这个每一个步长当成方程的系数,那么未知数就是每一次走了几步,即,多元一次方程。问题转换成,判定多元一次方程是否有解的问题。 ,有整数解,等价于,�1�1+�2�2+...+����=�,有整数解,等价于,(�1,�2,...,��)|� 即,所有系数的最大公约数是否可以整除 N

代码

#include <bits/stdc++.h>

using namespace std;

int n, d;
int a, b;

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

int main() {
    cin >> n >> d;
    cin >> a;

    n--;
    while (n--) {
        scanf("%d", &b);
        a = gcd(a, b);
    }

    if (d % a == 0) cout << "Yes";
    else cout << "No";

    return 0;
}

总结

这个有解的证明过程,确实不知道,得查一下。 把“人工语言”转换成“形式语言”,是这道问题考察的要点

参考

万物皆有源:多元一次不定方程有解的判定