1。
トピックます。https://vjudge.net/contest/316798#problem/P
コード:
書式#include <iostreamの> 書式#include <cmath> 書式#include <アルゴリズム> int型S [1000005]。 名前空間stdを使用。 メインint型() { int型M、K; //はk番目及びm互いに素がGCD(S [k]は、m個の)は、k番目たい== 1 一方、(CIN >> M >> K) { 私はint型。 int型NUM = 0; 用(i = 1; I <= M; iは++) { IF(__ GCD(M、I)== 1)[NUM ++] = I S; // numがmより少ない数、および正の整数とm個の互いに素であります } もし(K%NUM == 0)COUT <<(K / NUM-1)* M + S [NUM-1] << ENDL; // S [NUM-1]、M + S [NUM-1]、 2M + S [NUM-1]、... 他COUT << K / NUM×m個+ S [K%NUM-1] << ENDL; //は、K <NUMなるかもしれないS [K-1]、M + S [K-1]、2M + S [ K-1]、... } 0を返します。 }
参考ます。https://blog.csdn.net/huangshuai147/article/details/51277645
2。
トピックます。https://vjudge.net/contest/316798#problem/A
前:
フォワードウォームアップの前に:
書式#include <iostreamの> 名前空間stdを使用。 int型exgcd(、int型のB int型、int型&X、int型&Y)//参照の使用を参照してか、それを見て! { IF(B == 0) { X = 1。 Y = 0。 返します。 } INT、T = exgcd(B、%のB、X、Y); //トレーニング! int型のX0 = xで。 INT Y0 = Y。 X = Y0。 Y = x0-(A / B)* Y0。 トンを返します。 } メインint型() { A、B、X、Y、T INT。 CIN >> A >> B; T = exgcd(A、B、X、Y)。 coutの<<トン<<てendl; COUT << X <<」「<< Y << ENDL。 0を返します。 }
「数論:拡張ユークリッド」ソリューションは、私の別のブログで見つけることができます
3。
トピックます。https://vjudge.net/contest/316798#problem/B
繰り返す:
cにおけるGCDの倍数である(A、B)場合には:
//左と一緒に行くに加えて配置番号の右の係数!
...............
コード:
#include <ビット/ STDC ++。H> 名前空間stdを使用。 typedefの長い長いLL。 int型exgcd(-1,11,11-のB、LL&X、LL&Y) { IF(B == 0) { X = 1。 Y = 0。 返します。 } LL T = exgcd(B、%のB、X、Y)。 LLのX0 = xで。 LL Y0 = Y。 X = Y0。 Y = x0-(A / B)* Y0。 トンを返します。 } メインint型() { int型のトン。 cinを>>トン。 しばらく(t--) { LLのC、D、A、B、X、Y、X0、Y0、出発点として// C、Dは、エンドポイントであるステップ:、B。 CIN >> C >> D >> A >> B; (C> D)スワップIF(C、D)。 LL U =直流; //距離 LL G = exgcd(A、B、X、Y); // G = GCD 1のためのソリューションを対応する式の右辺の(a、b)は、デフォルト値! (uは%G!= 0)の場合 { COUT << - 1 <<てendl; 持続する; }すべて最初からやり直す// 他 { a/=g; b/=g; x*=(u/g); y*=(u/g); ll k=(y-x)/(a+b); ll ans=1e18; for(int i=k-1;i<=k+1;i++) { x0=x+i*b; y0=y-i*a; if(abs(x0)+abs(y0)==abs(x0+y0)) ans=min(ans,max(x0,y0)); else ans=min(ans,abs(x0)+abs(y0)); } cout<<ans<<endl; } } return 0; } /* int t=__gcd(a,b); a/=t;b/=t;d/=t; exgcd(a,b,x,y); x=d*x; y=d*y; */