同余方程

同余方程

https://ac.nowcoder.com/acm/problem/16563

扩展欧几里得

PS: 算是初次接触数论吧,但是很有意思的是遇到了一个讲解很透彻的博客,几乎把我之前的疑惑都解释清楚了,再次特别感谢那位不知名的博主

1.首先这是一道裸的数论的题目,这个题目有很多地方需要细节处理,第一个就是溢出的问题,因为题目给的数据很大,如果用int去定义的话,两个int变量相乘很可能就会溢出int类型的范围了,(int类型的范围最大是2^31-1,相当于2e9的样子),所以如果担心越界那就用long long去定义变量,那如果非要用int去定义的话,就需要简单的处理一下,我们先让两个变量去相除得到的结果然后再去相乘,这样就解决的越界的问题了

2.题目要求要求最小正整数解,而我们使用这个算法可能会得出负数,为了防止这种情况出现,我们就要在得出结果的时候加上一个整数再去模这个整数,那么就可以得到一个最小正整数解了

3.首先解释一下平时在数学课本上不出现的符号≡,同余符号,含义为两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余,记作a≡b(mod m)。那么,同余方程ax ≡ 1 (mod b),如果转化为我们通俗易懂的语言就是->求满足ax%b=1,1%b=1最小正整数解。
那么接下来就可以使用扩展欧几里得解决了。

AC代码一:

#include <bits/stdc++.h>
using namespace std;
int exgcd(int a, int b, int &x, int &y)
{
   if (b == 0)
   {
      x = 1;
      y = 0;
      return a;
   }
   int d = exgcd(b, a % b, x, y);
   int z = x;
   x = y;
   y = z - y * (a / b);
   return d;
}
int main()
{
   int a, b, x, y;
   scanf("%d%d", &a, &b);
   exgcd(a, b, x, y);
   printf("%d\n", (x + b) % b);
   return 0;
}

AC代码二:

#include <bits/stdc++.h>
using namespace std;
int a, b, k, x, y;
void exgcd(int a, int b)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    exgcd(b, a % b);
    k = x;
    x = y;
    y = k - a / b * y;
    return;
}
int main()
{
    scanf("%d%d", &a, &b);
    exgcd(a, b);
    printf("%d\n", (x + b) % b);
}
牛客课后习题题解 文章被收录于专栏

等待蜕变

全部评论

相关推荐

点赞 评论 收藏
分享
12-17 19:24
门头沟学院 Java
黑皮白袜臭脚体育生:看你后备隐藏能源多不多,最坏的情况就是每个星期的三天课程都不在周末,那么每个星期公司那边请一天半假,半天假请上午,上午正常上课,早点溜去请病假或者中午去请病假,然后坐高铁回公司,记得提前请学校那边实训课下午的病假,就说肚子痛,然后下午就公司上班,第二个实训周同样,但病假理由是牙齿痛,像肚子痛和牙齿痛这种校医院不方便查,会同意你出去检查的,很多时候都不需要你的检查报告,这里的问题就是最坏情况时距离过远的话可能要坐飞机才能赶上,然后请假的话不一定请了就有回应,可能要等老师,然后距离不远不近的情况到公司了也是迟到,得想个说辞掩盖一下,顺便晚上多加点班补下时间,特殊情况特殊处理,正常不建议加班常态化,这样每个星期可以多凑出来半天,老师面子也有了公司那边也不至于无法交差,就是有点费存粮,如果哪个星期的三天课有一天或两天在周末的话那就更好应对了。实习还是建议去,学校的课懂的都懂
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
12-17 17:43
Java抽象带篮子:绝绝子暴风吸入啊
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务