yukicoder No.356 円周上を回る3つの動点の一致
問題
No.356 円周上を回る3つの動点の一致 - yukicoder
円周上を3つの点が時計回りに移動している.
それぞれ,秒で一周するとき,
同じ点から動き始める時,次に3点が一致するのは何秒後か.
解法
秒後にが整数かつが整数ならば,3点が一致する.
まずとの最小公倍数を求め,とする.
が1でないとき,以前に点が一致することがあるので,その値でを割った時点でもとは一致する.
つまり,とだけなら秒後に一番先に一致することになる.
とでも同じように求めることができるのでその2つの結果の最小公倍数を求めれば良い.
[-- 追記 --]
解説を見たらこんなことしなくてもよかった.ていうか最後の式約分できる...
はと表せて,
もう一つの式と一緒に考えると
を求めるだけでいいらしい.
#include <iostream> #include <vector> #include <algorithm> using namespace std; #define RREP(i,s,e) for (i = s; i >= e; i--) #define rrep(i,n) RREP(i,(int)(n)-1,0) #define REP(i,s,e) for (i = s; i <= e; i++) #define rep(i,n) REP(i,0,(int)(n)-1) #define INF 100000000 typedef long long ll; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b,a%b); } ll lcm(ll a, ll b) { return a * b / gcd(a,b); } int main() { ll a, b, c; ll cm1, cm2; // denominator ll dv1, dv2; // numerator ll cm; ll cd1, cd2; cin >> a >> b >> c; // T1, T2 cm1 = lcm(a,b); dv1 = abs(cm1 / a - cm1 / b); cd1 = gcd(cm1,dv1); cm1 /= cd1; dv1 /= cd1; // reduction // T2, T3 cm2 = lcm(b,c); dv2 = abs(cm2 / b - cm2 / c); cd2 = gcd(cm2,dv2); cm2 /= cd2; dv2 /= cd2; // reduction cm = lcm(cm1,cm2); cout << cm << "/"; cout << gcd(cm/cm1*dv1,cm/cm2*dv2) << endl; return 0; }