扩展欧几里得(求逆元)
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;
}原来写了一个模板,是扩展欧几里得,后来不知道怎么就错了,我也是不知道怎么回事,那个模板好像是求求解线性方程时候的模板,然后就错了,我还是太水。
题目链接:点击打开链接
代码:#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;
}原来写了一个模板,是扩展欧几里得,后来不知道怎么就错了,我也是不知道怎么回事,那个模板好像是求求解线性方程时候的模板,然后就错了,我还是太水。
相关文章推荐
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
- 扩展欧几里得求逆元
- 数论基础(欧几里得,扩展欧几里得,逆元,斯特林)
- HDU 1576 A/B (扩展欧几里得求逆元)
- 扩展欧几里得+逆元
- 数论 —— 逆元(费马小定理/扩展欧几里得)
- HDU 1576 A/B (逆元求扩展欧几里得)
- 除法取模逆元,扩展欧几里得,费马小定理[数学]
- 扩展欧几里得求逆元
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
- hdu1576 A/B 扩展欧几里得求逆元
- 【HDU 3037】大数组合取模之Lucas定理+扩展欧几里得求逆元与不定方程一类问题
- [置顶] 浅析逆元、扩展欧几里得、类欧几里得和莫比乌斯反演(填坑ing)
- HDU1576 A/B (扩展欧几里得求逆元)
- 费小或者扩展欧几里得求逆元
- 扩展欧几里得模板&逆元求法
- zoj 3609 Modular Inverse 求最小逆元 裸的的扩展欧几里得
- nyoj-Color the necklace(Ploya定理 + 欧拉函数 + 扩展欧几里得(求逆元))
- POJ 1006 同余方程组 -- 扩展欧几里得求逆元
- hdu_1576A/B(扩展欧几里得求逆元)