标签:gcd else 青蛙跳 bfd turn include logs font imp
int EXgcd(int a,int b,int &x,int %y){ if(b==0){x=1,y=0;return a;} int cnt=x;int gcd=EXgcd(a,b,x,y); x=y;y=cnt+a/b*y; }
证明:
现在已知方程的一组解x0,y0;求满足条件的解x1,y1;
那这个方程a*x0+b*y0=gcd(a,b); ①
令a=b,b=a%b则有b*x1+(a%b)*y2=gcd(b,a%b); ②
其中gcd(a,b)=gcd(b,a%b)则联立① ②则有:
a*x0+b*y0=b*x1+(a%b)*y1 ③
a%b≡a-?a/b?*b ④// ??向下取整
联立③ ④则有a*x0+b*y0≡b*x1+(a-?a/b?*b)*y1 ⑤
拆开⑤就是 a*x0+b*y0≡b*x1+a*y1-?a/b?*b*y1 ⑥
根据群论 两边字母系数相同的放在相同位置就是a*x0+b*y0≡a*y1+b*(x1-?a/b?*y1) ⑦
然后得出y1=x0 ⑧
x1-?a/b?*y1=y0 变形就是x1=y0+?a/b?*y1 ⑨
⑧ ⑨就是可以的一个解
#include<iostream> #include<cstdio> #include<cstdlib> #define ll long long using namespace std; ll x,y,m,n,L; ll xx,yy; ll A,B,C,gcd; ll EXgcd(ll a,ll b,ll &x,ll &y){ if(b==0){x=1,y=0;return a;} ll g=EXgcd(b,a%b,x,y); ll cnt=x; x=y; y=cnt-a/b*y; return g; } int main(){ cin>>xx>>yy>>m>>n>>L; A=-n+m;B=L;C=-xx+yy; if(A<0){A=-A,C=-C;} ll gcd=EXgcd(A,L,x,y); if(C%gcd)printf("Impossible"); else x=(x*(C/gcd)%(L/gcd)+(L/gcd))%(L/gcd); cout<<x; return 0; }
标签:gcd else 青蛙跳 bfd turn include logs font imp
原文地址:http://www.cnblogs.com/ck666/p/7439609.html