博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod1256【exgcd求逆元】
阅读量:4594 次
发布时间:2019-06-09

本文共 1026 字,大约阅读时间需要 3 分钟。

思路:

把k*M%N=1可以写成一个不定方程,(k*M)%N=(N*x+1)%N,那么就是求k*M-N*x=1,k最小,不定方程我们可以直接利用exgcd,中间还搞错了;
//小小地讲一下exgcd球不定方程原理
对于ax+by=gcd(a,b);
我们设一下a>b,在简单直接把b=0时,gcd(a,b)=a.此时,x=1,y=0;
接着,a>b>0,我们这里可以摆两个式子:①:ax1+by1=gcd(a,b);继续,②:bx2+(a mod b)y2=gcd( b , a mod b );第二个式子为何呢?这就是gcd的辗转相除法的算法啊。而且gcd(a,b)=gcd(b,a mod b);
然后我们就能将gcd左边两个等式列个等式:ax1+by1=bx2+(a mod b)y2;额。。。a mod b可以写成?a-(a/b)b对吧,那么等式变成ax1+ by1= bx2+ (a - (a / b) * b)y2=bx2+ay2 - (a / b)by2 ;我们把ax1+ by1=bx2+ay2 - (a / b)by2拎出来,整理一下,写成:ax1+by1=ay2+b(x2-(a/b)y2); 那么很明显我们可以得到,x1=y2,y1=x2-(a/b)y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.

#include 
using namespace std;typedef long long LL;const int N=1e4;void exgcd(LL &k,LL &x,LL a,LL b){ if(b==0) { k=1; x=0; return; } exgcd(k,x,b,a%b); LL temp=k; k=x; x=temp-(a/b)*x;}int main(){ LL n,m; LL k,x; scanf("%lld%lld",&m,&n); exgcd(k,x,m,n); while(k<0) k=(k+n)%n; printf("%lld\n",k); return 0;}

转载于:https://www.cnblogs.com/keyboarder-zsq/p/5934804.html

你可能感兴趣的文章
virtualbox 安装 USB 扩展功能
查看>>
clang: error: linker command failed with exit code 1 (use -v to see invocation) 无法定位的问题...
查看>>
HDU 4003 Find Metal Mineral(分组背包+树形DP)
查看>>
数据导出和TreeView
查看>>
UI图标不用愁:矢量字体图标Font-Awesome
查看>>
android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事...
查看>>
指针数组和数组指针的区别
查看>>
KNN和SVM的区别和联系
查看>>
JAVA的Random类 Java中的Random()函数
查看>>
判断手机横屏和竖屏方向
查看>>
动态闪字
查看>>
docker入门1---docker的简介和安装
查看>>
MyEclipse2017修改Web Context Root
查看>>
svn的使用总结
查看>>
ERP光有主生产计划不够 还得详细生产排程
查看>>
HTML5 2D平台游戏开发#2跳跃与二段跳
查看>>
【bzoj3238】【Ahoi2013】差异
查看>>
Spring源码:Spring IoC容器加载过程(1)
查看>>
Hive row_number() 等用法
查看>>
vue如何使用rules对表单字段进行校验
查看>>