ABC162

昨日のコンテストについて。C#はまだ慣れないず(エラー出まくる)、レートが下がるのも嫌なので、今回はC++で挑戦。

結論から言うと、ボロボロでした。C問題でつまずいた。

画像1

途中までなぜか最小公倍数をひたすら求めたり、3つの数の最大公約数の求め方をぐだぐだ考えたり、計算量が間に合わずTLEになりまくったりで大荒れ(O(K^4)とかやってた)。

シンプルに3つの数a,b,cの最大公約数gcd(a,b,c)は、まず2数の最大公約数gcd(a,b)を求め、gcd(a,b)と残りの1つcの最大公約数を求めればいい。要するにgcd(gcd(a,b),c)で求まる。gcd(a,b)はユークリッドの互除法を使って求める。

#include <bits/stdc++.h>
using namespace std;

//2数の最大公約数
int gcd(int x, int y){
 if(x % y == 0) return y;
 return gcd(y, x % y);
}

//3数の最大公約数
int gcd_3(int x, int y, int z){
 return gcd(gcd(x,y),z);
}

int main() {
 
 int k; cin >> k;
 
 int ans = 0;
 for(int a=1; a<=k; a++){
   for(int b=a; b<=k; b++){
     for(int c=b; c<=k; c++){
       
       //何とか計算量を減らそうとしてあがいた残り
       if(a==b && b==c) ans += gcd_3(a,b,c);
       else if(a != b && b != c) ans += 6 * gcd_3(a,b,c);
       else ans += 3 * gcd_3(a,b,c);
       
     }
   }
 }
 
 cout << ans << endl;
}

以上!