Теория чисел боя крови

1.

Тема: https: //vjudge.net/contest/316798#problem/P

коды:

#include <iostream> 
#include <CMATH> 
#include <алгоритм> 
INT S [1000005], 

что используя пространство имен ЗППП; 
INT основных () 
{ 
	INT M, K; KTH // желания и т взаимно простые целые числа K - й НОД ( S [K], м) 1 ==. 
	это время (КИН >> >> к м) 
	{ 
		Int I, 
		INT NUM = 0; 
		для (I = 1;. Я <= т; я ++) 
		{ 
			ЕСЛИ (__ НОД (м, я ) == 1) с [Num ++ ] = я; // Num меньше т и т взаимно просты с числом положительных целых чисел 
		} 
		. ЕСЛИ (NUM% K == 0) << COUT (к / -число 1) * [. -число 1] S + м << епсИ // S [-число 1.], т + S [-число 1.], 2M + S [-число 1.], .... 
		еще COUT << K / NUM * M + s [K% NUM -1] << ENDL; // может сделать к <Num, с [к- 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> 
использование патезраса; 
INT exgcd (интермедиат а, б INT, INT & х, Int & у) //该用引用之处还是要用引用样子呀! 
{ 
	если (б == 0) 
	{ 
		х = 1; 
		у = 0; 
		возвращать; 
	} 
	INT т = exgcd (Ь, а% Ь, х, у); // тренировка !! 
	INT x0 = X; 
	ИНТ у0 = у; 
	х = у0; 
	у = х0 (а / б) * у0; 
	вернуться т; 
} 
INT основных () 
{ 
	Int а, б, х, у, т; 
	CIN >> A >> б; 
	т = exgcd (а, б, х, у); 
	соиЬ << т << епсИ; 
	соиЬ << х <<»«<< у << епсИ; 
	возвращать 0; 
}

Решения можно найти в моем другом блоге: «Теория чисел: Расширенная Евклида»

3.

Тема: https: //vjudge.net/contest/316798#problem/B

 

Повторение:

При с кратно НОД (а, б) в случае, когда:

 // коэффициент слева и справа с номером, помещенного в дополнение пойти с!

...............

 

коды:

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int exgcd(ll a,ll b,ll& x,ll& y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	ll t=exgcd(b,a%b,x,y);
	ll x0=x;
	ll y0=y;
	x=y0;
	y=x0-(a/b)*y0;
	return t;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		ll c,d,a,b,x,y,x0,y0;//c为起点,d为终点;步长:a,b;
		cin>>c>>d>>a>>b;
		
		if(c>d) swap(c,d);
		ll u=d-c;//距离
		 
		ll g=exgcd(a,b,x,y);//g=GCD(a,b),默认的那一组解所对应的方程右侧之值是为1! 
		if(u%g!=0) 
		{
			cout<<-1<<endl;
			continue;
		}//从头再来 
		else
		{
			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