簡潔な言語は、いくつかの場所になります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。