inline static VALUE f_addsub(VALUE self, VALUE anum, VALUE aden, VALUE bnum, VALUE bden, int k) { VALUE num, den; if (FIXNUM_P(anum) && FIXNUM_P(aden) && FIXNUM_P(bnum) && FIXNUM_P(bden)) { long an = FIX2LONG(anum); long ad = FIX2LONG(aden); long bn = FIX2LONG(bnum); long bd = FIX2LONG(bden); long ig = i_gcd(ad, bd); VALUE g = LONG2NUM(ig); VALUE a = f_imul(an, bd / ig); VALUE b = f_imul(bn, ad / ig); VALUE c; if (k == '+') c = f_add(a, b); else c = f_sub(a, b); b = f_idiv(aden, g); g = f_gcd(c, g); num = f_idiv(c, g); a = f_idiv(bden, g); den = f_mul(a, b); } else { VALUE g = f_gcd(aden, bden); VALUE a = f_mul(anum, f_idiv(bden, g)); VALUE b = f_mul(bnum, f_idiv(aden, g)); VALUE c; if (k == '+') c = f_add(a, b); else c = f_sub(a, b); b = f_idiv(aden, g); g = f_gcd(c, g); num = f_idiv(c, g); a = f_idiv(bden, g); den = f_mul(a, b); } return f_rational_new_no_reduce2(CLASS_OF(self), num, den); }
inline static VALUE nurat_s_canonicalize_internal(VALUE klass, VALUE num, VALUE den) { VALUE gcd; switch (FIX2INT(f_cmp(den, ZERO))) { case -1: num = f_negate(num); den = f_negate(den); break; case 0: rb_raise_zerodiv(); break; } gcd = f_gcd(num, den); num = f_idiv(num, gcd); den = f_idiv(den, gcd); #ifdef CANON if (f_one_p(den) && canonicalization) return num; #endif return nurat_s_new_internal(klass, num, den); }
int main(void) { int GCD; int t, n; int i, j, k; int nArr[100]; scanf("%d", &t); for(i = 0; i < t; i++) { scanf("%d", &n); for(j = 0; j < n; j++) { scanf("%d", &nArr[j]); } GCD = 0; for(j = 0; j < n - 1; j++) { for(k = j + 1; k < n; k++) GCD += f_gcd(nArr[j], nArr[k]); } printf("%d\n", GCD); } return 0; }
inline static VALUE f_lcm(VALUE x, VALUE y) { if (f_zero_p(x) || f_zero_p(y)) return ZERO; return f_abs(f_mul(f_div(x, f_gcd(x, y)), y)); }
inline static VALUE f_muldiv(VALUE self, VALUE anum, VALUE aden, VALUE bnum, VALUE bden, int k) { VALUE num, den; if (k == '/') { VALUE t; if (f_negative_p(bnum)) { anum = f_negate(anum); bnum = f_negate(bnum); } t = bnum; bnum = bden; bden = t; } if (FIXNUM_P(anum) && FIXNUM_P(aden) && FIXNUM_P(bnum) && FIXNUM_P(bden)) { long an = FIX2LONG(anum); long ad = FIX2LONG(aden); long bn = FIX2LONG(bnum); long bd = FIX2LONG(bden); long g1 = i_gcd(an, bd); long g2 = i_gcd(ad, bn); num = f_imul(an / g1, bn / g2); den = f_imul(ad / g2, bd / g1); } else { VALUE g1 = f_gcd(anum, bden); VALUE g2 = f_gcd(aden, bnum); num = f_mul(f_idiv(anum, g1), f_idiv(bnum, g2)); den = f_mul(f_idiv(aden, g2), f_idiv(bden, g1)); } return f_rational_new_no_reduce2(CLASS_OF(self), num, den); }
inline static VALUE nurat_s_canonicalize_internal(VALUE klass, VALUE num, VALUE den) { VALUE gcd; switch (FIX2INT(f_cmp(den, ZERO))) { case -1: num = f_negate(num); den = f_negate(den); break; case 0: rb_raise(rb_eZeroDivError, "devided by zero"); break; } gcd = f_gcd(num, den); num = f_idiv(num, gcd); den = f_idiv(den, gcd); if (f_one_p(den) && f_unify_p(klass)) return num; else return nurat_s_new_internal(klass, num, den); }
/* * call-seq: * int.gcdlcm(int2) -> array * * Returns an array; [int.gcd(int2), int.lcm(int2)]. * * For example: * * 2.gcdlcm(2) #=> [2, 2] * 3.gcdlcm(-7) #=> [1, 21] * ((1<<31)-1).gcdlcm((1<<61)-1) #=> [1, 4951760154835678088235319297] */ VALUE rb_gcdlcm(VALUE self, SEL sel, VALUE other) { other = nurat_int_value(other); return rb_assoc_new(f_gcd(self, other), f_lcm(self, other)); }
/* * call-seq: * int.gcd(int2) -> integer * * Returns the greatest common divisor (always positive). 0.gcd(x) * and x.gcd(0) return abs(x). * * For example: * * 2.gcd(2) #=> 2 * 3.gcd(-7) #=> 1 * ((1<<31)-1).gcd((1<<61)-1) #=> 1 */ VALUE rb_gcd(VALUE self, SEL sel, VALUE other) { other = nurat_int_value(other); return f_gcd(self, other); }
VALUE rb_gcdlcm(VALUE self, VALUE other) { nurat_int_check(other); return rb_assoc_new(f_gcd(self, other), f_lcm(self, other)); }
VALUE rb_gcd(VALUE self, VALUE other) { nurat_int_check(other); return f_gcd(self, other); }