AtCoder Beginner Contest 108
AtCoder Beginner Contest 108 - AtCoder
A - Pair
問題
考察
以上以下の偶数と奇数の選び方の個数を求める。偶数の個数はで、奇数の個数はで求まるので、その積を返す。
コード
int main(){ ll k; cin >> k; ll even = k/2; ll odd = (k+1)/2; cout << even*odd << endl; return 0; }
B - Ruined Square
考察
平面上の2点の座標が与えられ、反時計回りに正方形を構成するように残り2つの頂点を定めるときの頂点の座標を求める。
に着目し、残りの頂点の座標はこのベクトルを反時計回りに90°回転させて足していけば求まる。
コード
typedef pair<ll, ll> P; P rotate(P s, P t){ P p; p.first = s.second-t.second+t.first; p.second = t.second-s.first+t.first; return p; } int main(){ P p1, p2, p3, p4; cin >> p1.first >> p1.second >> p2.first >> p2.second; p3 = rotate(p1,p2); p4 = rotate(p2,p3); cout << p3.first << " " << p3.second << " " << p4.first << " " << p4.second << endl; return 0; }
C - Triangular Relationship
考察
以上以下の整数に関して、がすべての倍数となるようなの組み合わせの個数を求める。
を固定すると、が満たすべき条件は「はともにで割って余り、かつはで割り切れる」となる。結局、これはがで割り切れるという条件のもとで、を以上以下の、で割って余る整数の中から選ぶと考えることができる。がの倍数であるかどうかで場合分けして求めればよい。は負になることがあるので、剰余の計算をするときは十分大きいの倍数を足しておかないと計算が違ってしまうので注意が必要。
コード
int main(){ ll n,k; cin >> n >> k; ll ans = 0; for(ll a = 1; a<= n; a++){ if(2*(k-a+n*k)%k!=0) continue; ll bc = (a%k==0) ? n/k : (n+(k-a+n*k)%k)/k; ans += bc*bc; } cout << ans << endl; return 0; }
D - All Your Paths are Different Lengths
考察
整数に対し、20以下の自然数を定めて頂点から頂点までのパスの長さが以上以下のすべての整数をとるようなグラフを1つ求める。
まずがとかける場合は簡単で、としてについて頂点と頂点の間に長さの辺と長さの辺を加えることで実現できる。
次にがこの形で表せないとき、として同じように辺を加えると以下の長さのパスができるが、ここで「最大のパスの長さが以上にならないようにパスを加えていく」ことを考える。
現時点で最大のパスの長さをとおくと、以上以下のパスをつくるためには長さの辺を、この辺を通るすべてのパスの長さが以下となるように頂点と頂点の間に加えればよい。このはと計算でき、この操作を行うことでは増加する。
コード
struct edge{ll from, to, weight;}; int main(){ ll L; cin >> L; ll N = floor(log2(L))+1; vector<edge> E; for(ll i = 1; i <= N-1; i++){ edge e; e.from = i, e.to = i+1, e.weight = 1<<(i-1); E.push_back(e); e.weight = 0; E.push_back(e); } ll max = (1<<(N-1)) - 1; while(max!=L-1){ edge e; e.from = floor(log2(L-max-1))+1, e.to = N; e.weight = max+1; E.push_back(e); max += 1<<(e.from-1); } cout << N << " " << E.size() << endl; for(auto e: E){ cout << e.from << " " << e.to << " " << e.weight << endl; } return 0; }
雑感
今回は不参加で、後日解いてみましたがDはキツかったです。が20以下という制約も結構厳しいと思いました。最近2回はD問題が難しすぎます。