noip2012同余方程 扩展欧几里德

来源:互联网 发布:sql forceseek 编辑:程序博客网 时间:2024/05/17 15:19

好久没发博客了呀


下周就noip考试了,感觉很多应该要学的知识点都没学,而且又无心写作业,把扩展欧几里德看了一遍。

例题:noip2012同余方程

有几个需要记住的点在程序中作了标记,下面写清楚道理,忘记的话可以现推


//1

ax+by=gcd(a,b)

bx'+(a%b)y'=gcd(b,a%b)

根据欧几里德定理这两个等式右半部分相等,所以

ax+by=bx'+(a%b)y'=bx'+(a-b[a/b])y'=ay'+b(x'-[a/b]y')

x=y' y=(x'-[a/b]y')


//2

求出特解后的推导

ax0+by0=ax1+by1=gcd

a(x1-x0)=b(y1-y0)

设a'=a/gcd b'=b/gcd  //此时a'与b'互质

a'(x1-x0)=b'(y1-y0)

x1-x0是b'的倍数 (我也不知道为什么)

设x1-x0=kb'

x1=x0+kb'=x0+b/gcd*k

同理y1=y0+a/gcd*k


此题有解时gcd=1,所以x-x0=kb;

#include<iostream>using namespace std;int gcd(int a,int b,int &x,int &y){if(b==0){x=1;y=0;return a;}int ans=gcd(b,a%b,x,y);int temp=x;x=y;y=temp-(a/b)*y;//1return ans;}int main(){int x,y,a,b;cin>>a>>b;if(gcd(a,b,x,y)!=1){cout<<-1<<endl;return 0;}x=x%b;//2x+=(x<0)*b;cout<<x<<endl;return 0;}


0 0
原创粉丝点击