扩展欧几里得(求逆元)

来源:互联网 发布:欧洲为什么发达 知乎 编辑:程序博客网 时间:2024/06/13 13:32

昨天看了一下逆元,有费马小定理求逆元,扩展费马小定理求逆元,最重要的是有一个扩展欧几里得求逆元,我只是看了一下,并没有做题,今天做了一下,直接给wrong了,我也是没有话可说了,我还是太水。

题目链接:点击打开链接

代码:

#include<stdio.h>#define  mod 9973#include<string.h>#include <iostream>using namespace std;int extended_gcd(int a,int b, int &x, int &y){    if (b == 0)    {        x = 1;        y = 0;        return a;    }    else    {        int gcd = extended_gcd(b, a % b, x, y);        int t = x;        x = y;        y = t - (a / b) * y;        return gcd;    }}//int main()//{//    int i, x, y;//    const int P = 13;//    for (i = 1; i < P; ++i)//    {//        extended_gcd(i, P, x, y);//        while (x < 0) x += P;//        printf("1 div %d = %d\n", i, x);//    }//    return 0;//}//int main()//{//    LL a, b, t;//    scanf("%lld",&t);//    while(t--)//    {//        scanf("%lld%lld",&a,&b);//        LL ans = cal(a, b, 1);//        if(ans == -1)//        {//            printf("Not Exist\n");//            continue;//        }//        printf("%lld\n",ans);//x//    }//    return 0;//}//int  extgcd(int a,int b,int &x,int &y)//{//    int d=a;//    if(b!=0)//    {//        d=extgcd(b,a%b,y,x);//        y-=(a/b)*x;////    }//    else////    {//        x=1;//        y=0;//    }//    return d;//}int sum[100010],q[100010];char w[100010];int main(){    for(int i=1; i<mod; i++)    {        int x,y;        extended_gcd(i, mod, x, y);        while (x < 0) x += mod;        q[i]=x;    }    int a;    while(~scanf("%d",&a))    {        scanf("%s",w);        int s=strlen(w);        sum[0]=1;        for(int i=0; i<s; i++)            sum[i+1]=sum[i]*(w[i]-28)%mod;        int q1,q2;        for(int i=0; i<a; i++)        {            scanf("%d%d",&q1,&q2);            printf("%d\n",sum[q2]*q[sum[q1-1]]%mod);        }    }    return 0;}
原来写了一个模板,是扩展欧几里得,后来不知道怎么就错了,我也是不知道怎么回事,那个模板好像是求求解线性方程时候的模板,然后就错了,我还是太水。

0 0