您的位置:首页 > 其它

扩展欧几里得(求逆元)

2016-08-07 17:33 260 查看
昨天看了一下逆元,有费马小定理求逆元,扩展费马小定理求逆元,最重要的是有一个扩展欧几里得求逆元,我只是看了一下,并没有做题,今天做了一下,直接给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;
}原来写了一个模板,是扩展欧几里得,后来不知道怎么就错了,我也是不知道怎么回事,那个模板好像是求求解线性方程时候的模板,然后就错了,我还是太水。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: