题解:#8309.「BROI Round 1」破茧成蝶 审核通过

Brilliance 紫罗兰 2024-08-03 19:35:33 7

50tps

直接按照

进行枚举

60tps

先化简式子

然后直接从 开始枚举 ,直到满足条件输出。

或者直接推成最简带模数学式 即

枚举 也是一样的;

#include <bits/stdc++.h>
using namespace std;
int main() {
    long long a, b;
    cin >> a >> b;
    for (long long i = 1;; i++) {
        if ((a * i) % b == 1 或者 a * i - (((a * i) / b) * b) == 1) {
            cout << i << endl;
            return 0;
        }
    }
}


100 tps

记原方程 为方程 1

结论1.1: (a, b)=1 由题意得:

,则有:

,我们得到:

结论1.2: 假设该命题不成立,我们有:

此时就有矛盾出现,根据最大公约数的定义,代入可得:

又有 的最大公约数。所以矛盾,即证

结论 注意一除法横式:

易得:

注意到:

即证

结论2.1,欧几里得算法:

,我们可以的到两个引理。

引理1:

,我们有:

, 设 同结论 1.2 , 则有:

即证 引理2: 可知,此处不再细讲。 综上所述,我们有:

回到结论1.3:

设有一组 满足欧拉算法,易得:

应满足:

我们有:

于是:

可求得一组解:

扩展欧几里德算法是用来在已知 求解一组 ,使它们满足贝祖等式: (解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。

刚才的讲解已经比较清楚了,接下来我们来理一下解题思路:

  • 特殊情况: ,此时令 即可
  • 递归调用 函数,求得
  • 求解 ,函数结束。
  • 处理 为负数的问题。
#include <bits/stdc++.h>
using namespace std;
void exgcd(long long a, long long b, long long &x, long long &y) {
    if (!b) {
        x = 1;
        return;
    }
    exgcd(b, a % b, x, y);
    long long t = x;
    x = y;
    y = t - (a / b) * y;
    return;
}
int main() {
    long long a, b, x, y;
    cin >> a >> b;
    exgcd(a, b, x, y);
    cout << (x % b + b) % b;
}
{{ vote && vote.total.up }}