扩展欧几里得求乘法逆元
2016-06-02 12:18
274 查看
参考http://blog.csdn.net/zhjchengfeng5/article/details/7786595
#include <stdio.h>
#include <math.h>
__int64 ans_gcd(__int64 a,__int64 b,__int64 *x,__int64 *y)
{
if (b==0)
{
*x=1;
*y=0;
return a;
}
__int64 ans=ans_gcd(b,a%b,x,y);
__int64 temp=*x;
*x=*y;
*y=temp-a/b*(*y);
return ans;
}
__int64 calculate(__int64 a,__int64 b)
{
__int64 x,y,ans;
__int64 gcd=ans_gcd(a,b,&x,&y);
if (1%gcd!=0)//如果a与b不互质则没有乘法逆元
return -1;
x=x*(1/gcd);
b=abs(b);
ans=x%b;
if (ans<=0)
ans=ans+b;
return ans;
}
int main()
{
__int64 i,j,a,b,ans;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%I64d%I64d",&a,&b);
ans=calculate(a,b);//求a关于b的乘法逆元
if (ans==-1)
printf("Not Exist\n");
else
printf("%I64d\n",ans);
}
return 0;
}
#include <stdio.h>
#include <math.h>
__int64 ans_gcd(__int64 a,__int64 b,__int64 *x,__int64 *y)
{
if (b==0)
{
*x=1;
*y=0;
return a;
}
__int64 ans=ans_gcd(b,a%b,x,y);
__int64 temp=*x;
*x=*y;
*y=temp-a/b*(*y);
return ans;
}
__int64 calculate(__int64 a,__int64 b)
{
__int64 x,y,ans;
__int64 gcd=ans_gcd(a,b,&x,&y);
if (1%gcd!=0)//如果a与b不互质则没有乘法逆元
return -1;
x=x*(1/gcd);
b=abs(b);
ans=x%b;
if (ans<=0)
ans=ans+b;
return ans;
}
int main()
{
__int64 i,j,a,b,ans;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%I64d%I64d",&a,&b);
ans=calculate(a,b);//求a关于b的乘法逆元
if (ans==-1)
printf("Not Exist\n");
else
printf("%I64d\n",ans);
}
return 0;
}
相关文章推荐
- Codeforces 622C Not Equal on a Segment
- mac下编译源代码
- >/dev/null 2>&1
- >/dev/null 2>&1
- 安卓IPC机制之Binder详解
- 安卓IPC机制之Binder详解
- sqlserver复制报”应用复制的命令时在订阅服务器上找不到该行“解决方法
- linux更换源
- [leetcode] 70. Climbing Stairs
- delphi query下的sql动态查询
- JDBC入门学习
- linux下Mysql命令
- 从一个前端项目实践 Git flow 的流程与参考
- mvc设计模式和mvc框架的区别
- 设计模式
- [置顶] php的简单单例模式和工厂模式
- NYOJ 20 吝啬的国度 (DFS)
- (4.2.12)浅谈第三方推送[推送基础]:百度推送、小米推送、华为推送
- Linux之find命令的使用
- java用jdbc连接mysql数据库和sql server数据库