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