https://vjudge.net/problem/CodeForces-510D
トピックは、いくつかの番号を選択する最小コストを過ごすために変換することができ、その後、これらの数字は、あなたがそれを掻き出すことができ、加算と減算1または-1で得られた、または1することができ港うち1回、他の人がしています。Bezu定理、AX + = GCD(によって 、B)= 1、 Bezu定理が+ CZ + ...によって、nにAX +を拡張することができる = GCD(A、B、C、...)。次数mは、[i]は、iの最小コストGCD、SPFA暴力更新、最終的な出力Mとして得られる[1]
#include <iostreamの> する#include <cstdioを> する#include <キュー> の#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <unordered_map> の#define INF 2147483647 の#define N 1000010 の#define P(A)のputchar (A) の#define(iは、、B)(iは= int型、iが= Bを<; ++ i)がために関して使用名前空間STDを、 int型N、K。 INTをL [N]、C [N]。 キュー < 整数 > Q; unordered_map < INT、INT > M。 無効 に(INT&X){ int型、Y = 1。チャー C = GETCHAR(); X = 0 。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();} 一方、(C <= ' 9 ' && C> = ' 0 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR()。* = Y。 } ボイド O(INT X){ 場合(X < 0){P(' - '); X = - X;} もし(X> 9)O(X / 10 )。 P(Xの%10 + ' 0 ' )。 } int型 GCD(INT A、INT B){ リターン(%Bは== 0 B:GCD(B、%のB))。 } ボイドspfa(){ ながら(!q.empty()){ int型、T =q.front(); q.pop()。 (Iについて1 、N){ K = GCD(L [i]を、T); もし(!M [K]){ q.push(K)。 M [K] = M [T] + M [L [I]]。 } 他 M [K] =分(M [K]、M [T] + M [L [I])。 } } } (){主符号付き で(N) (Iについて1 、N) における(L [I])。 (Iについて1 、N) における(C [I])。 (Iについて1 、n)の 場合(!M [L [I]) M [L [I] = 分(M [L [i]は]、[I] C)。 他{ q.push(L [I])。 M [L [I] =のC [i]は、 } spfa()。 もし(M [ 1 ]) O(M [ 1 ])。 他の O( - 1 ); リターン 0 ; }