数論の戦闘血

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;    */ 

  

 

 

 

 

 

 

 

 

 

 

 

 

  

 

おすすめ

転載: www.cnblogs.com/dragondragon/p/11295322.html