AcWing 878. 线性同余方程

AcWing 878. 线性同余方程

仅看这道题的话,我觉得还是不是很容易看出思路来的,
y总把这个式子拆分,
拆分成了
aixi-yim=bI;
这个再进行一个转换。
aixI+yim=bi
这与扩展欧几里得算法就很像了。
如果有解的话,那么bi一定是a,m的倍数。
扩展欧几里得也是这么说的,然后思路就来了。会扩展欧几里得的话这道题就很简单啦
AcWing 878. 线性同余方程
最后的x应该等于 如果有解,b/gcd(a,m)*x1%m;

#include<iostream>
using namespace std;

int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;y=0;
        return a;
    }
    int x1,y1;
    int d=exgcd(b,a%b,x1,y1);
    x=y1;y=x1-a/b*y1;
    return d;
}

int main(void)
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b,m,x,y;
        scanf("%d %d %d",&a,&b,&m);
        int d=exgcd(a,m,x,y);
        if(b%d) puts("impossible");
        else
        printf("%d\n",(long long)b/d*x%m);//前面的相乘可能会产生很大的数,所以要采用long long
    }
}
上一篇:数论问题(1)


下一篇:数学知识-扩展欧几里得