[合同方程式 - ユークリッドを拡大する解決]

簡潔な言語は、いくつかの場所になりますKanla〜、非常に明確ではありません話すことがないかもしれません

テンプレートのタイトル合同式

用正ソリューションユークリッドの拡大(百度に多くの関連ブログは)
少しタイトルを説明する:
$斧\当量1 PMODを求めている{B } 最小\ $はある正の整数解。

意味:指定された\(A、B \) 最小の正の整数を見つける\(X \)よう\(AX用の\ B = MODを1 \。)

主なポイントは言いました:

1.基本

我々見てきましたが、タイトルが最低必要と強調している正の整数解を、私たちは2点の終わりのことを確認する必要があります
。・このソリューションでは、正の整数である
・このソリューションは最小限で
最終的に得られるANSた後、2つの文でこのコードを追加しますので。

while(x<=0)x+=b;
x%=b;

ことを確実にする最初の文\(X-> 0 \) 第二文ことを確実にするために、\(X \)最小

2.変換の問題

私は特に理解していなかった、正直、まだ少し話程度と:
C ++では( '/' =割り切れる)、\(A \ MOD B = AB×(A / B)\)
その後合同記号
\(a≡ Bの\のPMOD {P} \)を表し\(\ P-MOD P-MOD \ \ = B)を、つまり、我々は、合同について話しています。
だから、$斧\当量のタイトルは、1 \ PMODは{ B} $ も明白な意味、また、上記のは...言った
後、次の時にマニュアル[面白い]ユークリッドの役割を拡大することです

3.コードのアイデア

初!タイトルはシンプルに見えるかもしれませんが、私たちは暴力的な列挙ではありませんが、\(X \) Tの値がひどくなります!

第二に、一般的なユークリッドに従って変換についての質問、\(GCD(A、B)= GCD(B、A \ MOD B)\) および式の質問ので本質はれる\(AX +によって1 = \) 新しいの導入することは明らかである\(Y \)はまだ不明、あるいは負である。
方法によって、拡張ユークリッドがフォーム解決するために使用され= GCD(によって\(斧+を 、B )\)式の。
原理は、方程式である\(= MによるAX + \ ) xolutionである\(MOD GCD \ M(A、B)= 0 \)
ここで私は、書くdalaoのいくつかを選ぶことができない証明は次のとおりです。

あなたが狂った拡張モジュールユークリッドアルゴリズムを設定することができ、ああ...その後
exgcd関数を書くことで、コードは非常に簡単です:

void exgcd(ll a,ll b)
{
    if(b==0)
    {
        x=1,y=0;
        return;
    }
    exgcd(b,a%b);
    k=x,x=y,y=k-a/b*y;
    return;
}

ここで注意してください\(X \)預金の答えですので、\(X、Yの\は)グローバル変数として設定する必要があります!私たちができるの前で話すことにより、プロセスの場合には、最終的な出力...
完全なコード。

#include<bits/stdc++.h>
#define FAST_IN std::ios::sync_with_stdio(false);cin.tie(NULL);
#define ll long long
using namespace std;
ll x,y,k;
inline void exgcd(ll a,ll b)
{
    if(b==0)
    {
        x=1,y=0;
        return;
    }
    exgcd(b,a%b);
    k=x,x=y,y=k-a/b*y;
    return;
}
int main()
{
    FAST_IN;
    ll a,b;
    cin>>a>>b;
    exgcd(a,b);
    while(x<=0)x+=b;
    x%=b;
    cout<<x<<endl;
    return 0;
}

OV。

おすすめ

転載: www.cnblogs.com/moyujiang/p/11240277.html