浙江省省赛[扩展欧几里得] J Modular Inverse

#include<cstdio>
    using namespace std;
int GetMaxDiv(int x, int y)
{
    while(y)
    {
        int tmp = y;
        y = x%y;
        x = tmp;
    }
    if(x==1)
            return 1;
    else
            return 0;
}
int main()
{
    int n;
    int a,m;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&a,&m);
        if(m==1)
            printf("1\n");
        else if(GetMaxDiv(a,m)==0)
            printf("Not Exist\n");
        else{
            for(int i=1;;i++){
                if((a*i)%m==1){
                    printf("%d\n",i);
                    break;
                }
            }
        }
    }
    return 0;
}

第一题和最后一题很水,就不写啦

然后倒数第二题;

根据数学公式可知其实就是ax%m=1

求最小的x

问题:为什么m=1x=1,因为我觉得这种情况应该是不存在;

可是为什么am的最大公约数不为1

时一定无解呢?

然后我就发现这个问题才没有这么简单呢,

它涉及到扩展欧几里得的相关知识

http://baike.baidu.com/link?url=_PmRwR12ZB0x3Twsjd38OiaQ77Rpn7QJ0VDMP1r6Vvh-AA6ocWZYLkufDALew4GyBLG3862I-IAfEZvlsMUkSq

gcd(a,b)=gcd(b,a mod b)

所以我们可以知道gcd(ax,m)=gcd(m,1)=1

所以当m=1x=1

所以当am的最大公约数不为1时,gcd(ax,m)!=1所以等式不成立。

好吧...所以我也不知道为什么王辉大神表示这道题很简单QAQ

然后对于这道题我们就可以暴力求解一发啦啦因为数据太水了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值