数論 - 定理シュウペイ

シュウペイ定理

セット、bが全てゼロの整数であり、その後、整数X、Y 、その結果、X + B * A Y = GCD(A、B)  。

少し証明

アプリケーション

n個与えるカード、それぞれのLi 及びCIを無限に長いテープ上では、CI過ごすために選択することができます カードiを買うためにお金を、左にまたはあなたが右のliジャンプすることができ、単位を。あなたは、少なくとも過ごすテープ上のすべてのポジションをスキップすることができるどのように多くのドルを確認して下さい。そうでない場合は、-1の出力

解像度:

問題の分析は、2つの数の場合を考えると、あなたはそれぞれのグリッドにジャンプしたいことがわかった、私たちは、追加または1の絶対値を加算したことにより、これらの数字を数回行う必要があり 、その後、ペイ・シュー定理を考えました。

リリースすることができます:場合とbは互いに素、2つの整数、Xが存在しなければならないとY =で、その結果、1 + AXを。 。

これは、1の絶対値を加算または減算することによって選択されたカードの場合数の数倍が得られることになる素数定数次いで、この時間は、動的プログラミングを解決するために考慮することができます。

これらの素数、0であるため、しかし、アイデアは、転送することができるから始まるノードの数は、すべてのステップは、必要な  費用を記録しながら、0からになった、(ノード番号、次のノード)の最大公約数を 連続GCDを通じて最終的になり、最小価格。

以来:プライムは最大公約数が1 、GCD(0、X)= X  この二つの定理、アルゴリズムが正しい証明することができます。ダイクストラが解決プライオリティキューの最適化を選択します。

しかし、データは、最大の範囲ので、必要性はすでにカード、オープン配列タグを買って記録するかどうか、という問題があり、  メモリの制限を超える10 ^ 9、それは使用することが考えられます unordered_map 

書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム> 
書式#include <cmath>  
の#include <マップ> 
書式#include <キュー> 
の#include < 文字列 >  
の#include <iostreamの> 
の#include <スタック>
 に#define LL長い長いです
 #define INF 0x3f3f3f3f 
テンプレート < クラス T>インラインボイド GMAX(T&、T b)は、{ もし、(B>)= B;} 
テンプレート < クラス T>インラインボイド GMIN(T&、T b)は、{ もし、(B <A)= B;}
使用して 名前空間はstdを、
CONST  INT N = 303、M = 0、Z = 1E9 + 7、MAXINT = 2147483647、MS31 = 522133279、ms63 = 1061109567、ms127 = 2139062143 constの ダブル EPS = 1E- 8、PI = ACOS( - 1.0)。// 0.0 
マップ< int型int型 > モップ。
マップ < int型int型 > ::イテレータそれ。
INT L [N]、C [N]。
int型のn;
int型の GCD(int型のx、int型のY)
{ 
    int型のZ。
    一方、(Y)
    { 
        Z = X%のY。
        X = Y。
        Y = Z。
    } 
    戻りX。
} 
int型のmain()
{ 
    ながら(〜のscanf(" %d個"、&N))
    { 
        mop.clear()。
        以下のためにINT iが= 1 ; I <= N; I ++)のscanf(" %dの"、&L [I])。
        以下のためのint型iは= 1 ; I <= N; I ++)のscanf(" %dの"、&C [I])。
        以下のためにINT iが= 1 ; iが<=は、n; iは++ 
        { 
            ために(それがmop.beginを()=;それ= mop.end();!それ++ 
            { 
                int型、X = IT-> まず、
                INT Y = IT-> 第二;
                INT G = GCD(L [i]は、X)。
                もし(mop.find(G)== mop.end())モップ[G] = Y + C [i]は、
                 GMIN(MOP [G]、Y + C [I])。
            } 
            であれば(mop.find(L [I])== mop.end())MOP [L [I] =C [i]は、
            GMIN(MOP [L [I]、C [I])。
        } 
        であれば(mop.find(1)== mop.end())のprintf(" -1 \ n " );
        のprintf(" %dの\ n "、モップ[ 1 ])。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/2462478392Lee/p/12459710.html