P1292は、[注い]問題への解決策

ユークリッドおよびユークリッド延長

ブログは、より良い、食べて:ユークリッドおよびユークリッドの拡大-核融合炉のコア-羅Guboオフ

以下では、必要性があること(それはWWWWについて)すべての事前の知識です

あなたは事前知識のすべてを学んできた場合は、
無視してください(バカ\)\空のナンセンスは、
この質問に内容を直接見


内容:

  • 1.ユークリッドの定理
    • 証明します
    • アプリケーション
  • 2.シュウペイ定理

  • 3.拡張ユークリッド
    • 証明します
    • 無期限解決線形方程式
  • この話題に関しては4


1.ユークリッドの定理:

即: \(\大GCD(A、B)= GCD(B、\ MOD B)\)

\(B = 0 \) (MID \ MID \ \ GCD(A、B)=)\

  • 高齢者に証明CYHありがとう:

    提供:\(A、B \)は、の最大公約数である\(C \)

    则: \(A = NC \ \のB = MC \) \((N、ZにおけるM \)\) \(= k個の\倍B + R \)

    その後: \(R&LT = A \ B =%AK KMC-NC = B =(N -キロ)C \)

    作る\((A、B)=(B、\%B)を\)

    :私たちは、証明書が必要です\(B、Rの\)が最大公約数でもあるです\(のC \)

    即ち: \(MC = Bは、R =(N -キロ)C \) - \(キロ)\ M(n)は、プライム。

    • 子供の証明:

      矛盾によって、存在設け\(D \)\(M、(N-キロ )\) 最大公約数であり、\(D> 1 \)

      提供:\(N-QD-キロ= \) \(PD M = \)

      次に: \(MC = B = \\ PDC)

      \(\ A = KB + R = kpdc + QDC = DC(KP + Q)\)

      その後: \(A \)が存在する因子\(DC> C \)

      この結論と\(、B \)の最大公約数\(C \)と矛盾

      従って:存在しない\(D> 1 \)\(M、(N-キロメートル )\) 最大公約数であります

      次に: \(M、(N -キロ)\)プライム、サブは証明しました。

    子によって実証さ、与える:- \(キロ)C \ MC = Bは、R =(n)は、で\(M、(N -キロ)\)プライム。

    その後:\(B \)\(R&LT \)は、最大公約数がまだある\(C \)

    QED。


  • アプリケーション:

    上記の知識により、我々は要求書くことができます\(、B \)された\(GCDを(a、b)は \) の関数であり、

    再帰によって決定されるように、ユークリッドの定理によって得ることができる\(GCD(B) \) 値

    再帰的な境界は:場合(B = 0 \)\場合、\(GCD(A、B)は、\ =)を

    簡単なコードの実装:

int gcd(int a,int b)
{
    if(b) 
      return gcd(b,a%b);
    else 
      return a;
}

また、1行のように書くことができます。

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

2.シュウペイ定理:

セット\(B \)全てではない\(0 \)の整数、整数\(X、Y \) そう\(\大AX + = GCD(Aによって、B)\)

特に、\(GCD(A、B)= 1 \) \(\ Leftrightarrow \)
が存在する\(X、Z \でY \) その結果:\(= AX + \による1)

?定理の正しさを証明するために、どのようにそれが読むことを続けてください。


3.ユークリッドの拡張:

完全ではないため、\(0 \) 2つの数の\(A、B \) 無限の数が存在しなければならない\(X、Y \) 式そのよう
\(=による\大斧+ GCD(a、b)は\ 設立

  • 証明:

    セット\(> B \)

    1. 場合B = 0 $ $、\(GCD(A、B)は、\ =)を、今回唯一の解を有する:(X = 1、Y = 0 \)\

    2. とき(\回のB \ない\ = 0 \) 、

    ユークリッドの定理:見つかったの$ GCD(a、b)は= GCD(B、%b)は$、

    \(\下線{AX +によって} = GCD(A、B)= GCD(B、\%のB)= \下線{B {X 1} +(\%のB)Y1} \)

    (セット\(X1、Y1の\)は、上記条件を満足する解の集合です)

    而:\(FRAC \ = A- \ lfloor Bの\%{A}、{B} \ rfloor倍B \ \)

    その後:元の方程式は、に変換することができます。

    ①。\(FRAC \ = BX1 +(A- \ lfloorによって斧+ {A}、{B} \ rfloor回\ b)のY1の\)

    ②。\( - 1 \によって\ lfloor \ FRAC {A}、{B} \ rfloor = BX1 + AY1によって斧+)

    ③。\(で斧+ = AY1 + B(X1-\ lfloor FRAC \ {A}、{B} \ rfloorのY 1)\)

    ③のうち、入手することができます。

    \(X = Y1 \)

    $ Y = X 1 \ lfloor \ FRAC {A}、{B} \ rfloor Y1 $

    したがって、得ることが可能である\(= Cによって斧+を\ ) ソリューションのセット

    他の整数式\(XI、YIの\)が満たされます。

    $第XI = X + \ FRAC {B} {GCD(A、B)} \時間t $

    $のYI = Y + \ FRAC {A} {GCD(A、B)} \時間t $

    これは、(Z-中のt \ \)\

  • コードの実装

    ソルバー書き込むには(= GCD(で斧+ \を 、B)\) プログラム

    上記の証拠を通じ、それは明らかである、再帰によって達成することができます

    B = 0 $場合$、場合:再帰的な境界である\(GCD(A、B)は、\ =)を:、今回唯一の解を有する(X = 1、Y = 0 \)\

    コード:
    cpp int exgcd(int a,int b,int d,int &x,int &y) { if(!b) { x=1 , y=0; return a; } d=exgcd(b,a % b,x,y); int tmp=x; x=y , y=tmp-a/b*y; }
  • 不定方程式を解きます:

    := C $によって$斧+:不定方程式の

    拡張ユークリッドによると、それが見つかりました:

    方程式のための\(= GCD(A、B)によってAXの+ \)有無アレイ溶液\(X、Y \)

    その後:

    1.場合、$ Cの%のGCD(a、b)は\ではない= 0 $、元の方程式が解を持ちません。

    2.もし\(Cの\%のGCD(A、B)= 0 \)

    集合\(D = GCD(A、B)は\) 元の方程式はに変形することができます。

    \(\時間(Xの\時間\ FRAC {D} {C})+ Bの\時間(Y軸\時間\ FRAC {D} {C})= D(= Cの\時間\ FRAC {D} {C} )\)

    置換により、そう\(X1 =(X \タイムズ\ FRAC {C}、{D})\) \(Y1 =(Y \タイムズ\ FRAC {C}、{D})\)

    方程式を解く:\(AX1のBY1 = D + \)の有無アレイソリューション\(X1、Y1 \)

    解決しよう\(X1、Y1の\)の後に我々が得ます:

    \(X = X1 \回\ FRAC {C}、{D} \)\(Y = Y1 \回\ FRAC {C}、{D} \)

    元の方程式得るために\(= Cによって斧+ \ ) ソリューション


この質問に関しては4:

(ロングったらしいはあまりついに右のそれを取得言い始めました)

  • 3回の操作でのタイトル:

    ボリュームで樽にワインを① \(\ミリリットル\ b)は、ガラスの
    ②の体積(A \ミリリットル\)\ワイングラスでバレルに注ぎ、
    ③ボリューム\(Bを\ mlの\)ワインのガラスの体積に注いだ\(A \ミリリットル\)でガラス。

  • 問題の意味の分析:

    提供される残りの最後のアルコールの最小量として\(ANS \)
    各加算\(B \ミリリットル\)ワイン、それぞれが注ぎ\(A \ミリリットル\)ワイン

    あります:
    $ ANS = -ax_1 + by_1(X_1、Z-でY_1 \)$

    この方程式はに溶液不定趣旨を有している(ANS = K \時間\ \ GCD(Zにおいて、B)\(k個の\)\) と必要\(ANS \)非最小の負の整数解\(ANS = GCD (a、b)は\)


  • アルゴリズム:

    拡張ユークリッドと
    ソリューション不定方程式(\ \ GCD(A、B
    )= ax_1 + by_1 \) のセット取得する\(X_1を\)\(Y_1 \)ソリューション

    次に\(X_1 \時間(-1)\ \ A \時間(-1)\) ;
    元の方程式に:
    \(\ + by_1 ax_1下線{} =(-a)\タイムズ(-x_1)+ by_1 = \ {-ax +によって下線
    } \) を得た:
    \(X -x_1 = \)
    \(Y = Y_1 \)

    それから
    cpp while(x<0 || y<0) x+= (x<0 )?b/gcd:0, y-= (x>=0)?a/gcd:0;

    \(X、Yの\)は、最小の非負整数解に変換される
    回答を得ます


取り付け\(AC \)コード
#include<cstdio>
#include<ctype.h>
//====================================================
int a,b,x,y,gcd;
//====================================================
inline int read()
{
    int fl=1,w=0;char ch=getchar();
    while(!isdigit(ch) && ch!='-') ch=getchar();
    if(ch=='-') fl=-1;
    while(isdigit(ch)){w=w*10+ch-'0',ch=getchar();}
    return fl*w;
}
void exgcd(int a,int b)//扩展欧几里得求线性不定方程的解 
{
    if(b)
    {
        exgcd(b,a%b);
        int k=x;
        x=y , y=k-a/b*y;
    }
    else 
      x=1,y=0,gcd=a;
    return ;
}
//====================================================
signed main()
{
    a=read(),b=read();
    exgcd(a,b);
    x*=-1,a*=-1;//进行转化 
    while(x<0 || y<0)//获得最小的非负整数解 
      x+= (x<0 )?b/gcd:0,
      y-= (x>=0)?a/gcd:0;
    
    printf("%d\n%d %d",gcd,x,y);
}

おすすめ

転載: www.cnblogs.com/luckyblock/p/11456326.html