拡張ユークリッド自己の研究ノート

ロス・バレーのボード上https://www.luogu.org/problem/P1082
分析するには、この質問:
数学的変換、導出は
ax≡1(MODB)求めている
変化があれば:斧%、B = 1 --- "斧+ = 1
コースyは単に「雷鋒」それ正または負であるかどうか、不明(ただし、yは整数である)は、最終需要がxは
= 1 + AXに、我々は解決するexgcd。の= GCD(x、y)で斧+を解決するために、元の溶液をexgcd。
ここで(B)=、bは互いに素、GCD次いで、溶液が存在しなければならない 1
GCD(a、b)はaとbは、それがGCD(a、b)は、複数の(xだけ斧+要因である:立証、yは整数である)、この式のタイトル:= 1によって斧+、その後、GCDは、(B)だけなので、bは互いに素は、1であることができる
愉快的exgcd付き!(残念ながら、多くの発現ああも押さ)
GCD(A、B)=既に取得により 1( 上記実証されている)GCD(A、B)= GCD(B、%b)は( に共通GCD)このことは、問題を行う
元の式が知られている:斧+ = GCDによって( a、b)は答えがXXを想定し、yyはGCDさ(B、%B)を
BであるXX +(%b)は YY = GCD(B、 %b)は、我々はGCD(A、B)= GCD知っている必要があり (B、%のB)、 およびGCD(A、B)= 1
、次いでX + B Y = 1件のB XXの+(%のB) YY =を1 B X-の+ Y-B = XX +(%b)は YYは
少し厄介%を感じていないですか?実際には、それが一目答え処理を妨げます。%B = A-(INT (A / B))(int型ここでは、oier習慣を丸め表し、int型でもOKです書き込みませんが、ここに書くためにそれを減らすために誤解)
式は、となるであろう:A X + B Y = B XX +(A-INT(A / B) B)YYの
プッシュ:A
X + B Y = B XX +(A-INT(A / B)B) YY X B + Y B = XX + A YY B- INT(A / B) YY A+ B X Y A = YY + B(XX-YYのINT(A / B))は
今の回答の組、それことが分かる
X A = YY B Y =(XX-YYのINT(A / B))、
その(私は自分のドラフトを行うために自分自身を教えた後、もちろん)私はそれを起草かどうかを確認するために良いプッシュ価値タイトル、
ABの
GCD(a、b)は1 =
= 1でAXの+を
%B、= GCD(bでAXの+ )
B
XX +(%B)YY = GCD(B、%のB)
B
XX +(%のB)YY = GCD(A、B)
B
XX +(%B)YY = 1
A
X + B Y = B XX +(%のB)YY
A
X + B Y = B XX +(AB&INT(A / B)) YY
A X + B Y = B XX + A YY-B (INT(A / B)) YYの
A X + B= Y- YYの+ bの(XX-INT(A / B)YY)
X-Y-YY = =(XX-INT(A / B)
YYは)
非常に完全ではないので、私が見てきた証拠名の一部、もはや許可
プログラム再帰的な
再帰的な実装では、それは境界条件がまだ開始する方程式持っていないとして、非常に明確でなければなりません
= GCDで斧+を( b)のB = 0は(a、b)が明らかに(0)GCDさ= GCDされると 、 その後、 xは確かに確立1式に等しい
そうでない場合は、国境を越えた値に大きすぎる表示されることがあり、私はyは理論的には、直接のlet Y = 0を持つことになり、当然のことながら、任意の値にすることができ、ここでことを見ることができると信じて
最終の場合と答え:最小要件が正ただ一つの解決策で得られた整数は、いくつかの処理を必要とする
更なるレイ未知C(整数)と仮定される
式に代入する:斧を+ + ABC-ABCによる = 1(X + BC)+ B(Y-AC)= 明らか1、X、Yは、(X + BC)になると(Y-AC)、そしてx、yは依然としての整数
倍数bを減算又は加算することにより(上記で示されているXと)この方程式の任意の溶液を得るために、このよう複数のBこの方程式の解である
モジュロBがいることを確認するために最小の正の整数解であり、xが負の場合、数値が正であれば、Bを追加していくことは
、以下であるコード

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map> 
using namespace std;
#define re register int
#define int long long
inline int read(){
    int x=0,ff=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')ff=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return x*ff;
}
//萌新的推导过程,乱的一批
/*
a b
gcd(a,b)=1
ax+by=1
ax+by=gcd(b,a%b)
b*xx+(a%b)*yy=gcd(b,a%b)
b*xx+(a%b)*yy=gcd(a,b)
b*xx+(a%b)*yy=1
a*x+b*y=b*xx+(a%b)*yy
a*x+b*y=b*xx+(a-b*int(a/b))*yy
a*x+b*y=b*xx+a*yy-b*(int(a/b))*yy
a*x+b*y=a*yy+b*(xx-int(a/b)*yy)
x=yy y=(xx-int(a/b)*yy)
*/
int x,y,xx,yy;
void gcd(int a,int b){
    if(b==0){x=1;y=0;return;}
    gcd(b,a%b);
    xx=x;yy=y;
    x=yy;y=(xx-(a/b)*yy);
}
signed main(){
    int a,b;a=read();b=read();
    gcd(a,b);
    while(x<0)x+=b;
    x%=b;
    printf("%lld\n",x);
    return 0;
}

さて、この問題は終わりました

おすすめ

転載: www.cnblogs.com/ffrxy01bt/p/11261296.html