10. B問題 問題概要
? 整数 A, B が与えられる
? A と B の十進表記をこの順に連結して
得られる整数を 2 倍したものを出力せよ
? 1 ≦ A, B ≦ 999
3/19/15
11. B問題 アルゴリズム
? まずは A と B の十進表記を連結する
? 整数が与えられているとはいえ、
文字列として受け取ることが可能
? 多くの現代プログラミング言語では、
文字列を '+' 演算子で連結できる
int main(){
string A, B;
cin >> A >> B;
string AB = A + B;
...
3/19/15
18. C問題 アルゴリズム (満点)
? 満点 (100 点): 2 ≦ H, W ≦ 10, 2 ≦ T ≦ 10
9
? 「この x で T 秒以内にゴール可能か?」…☆ を
x = T-1, T-2, … とすべて調べることはもはや不可能
? 本当にこの順にすべて調べる必要はあるだろうか?
? x を小さくすると、最短経路も短くなる。従って、
x = i で ☆ の答えが Yes なら、x < i のときも Yes.
x = i で ☆ の答えが No なら、x > i のときも No.
3/19/15
19. C問題 アルゴリズム (満点)
? lo = 1, hi = T として、hi – lo = 1 となるまで
以下を繰り返すと、 lo に求めたい最大値が入る
mi = (lo + hi) / 2
if(x = mi のときT秒以内にゴール可能) then lo = mi
else hi = mi
? 1回のループで hi – lo がおよそ半分になるため、
T = 10
9
でも log2
(10
9
) = 30 周程度で終了する
? 「二分探索」と呼ばれる手法
? 別解もあります (x > H*W のときは黒を通る回数を最小化した上で白の回数を
最小化するべきで、数式で最大値を出す。ダメなら x ≦ H*W のときを全部調べる)
3/19/15
20. ?AtCoder Inc. All rights reserved.
1.問題概要
2.アルゴリズム
3/19/15
D問題 LCM Rush
21. D問題 問題概要
? 整数 N, K が与えられる
? LCM(1, K) + LCM(2, K) + … + LCM(N, K) を
1,000,000,007 で割った余りを求めよ
(LCM(a, b) は a と b の最小公倍数)
? 1 ≦ N, K ≦ 10
9
3/19/15
22. D問題 アルゴリズム (部分点 1)
? 部分点 1 (5 点): 1 ≦ N, K ≦ 100
? i * K は i の倍数でも K の倍数でもあるから、
LCM(i, K) は i * K 以下
? 1 から i * K までの各整数について、小さい順に
i と K の両方で割っていき、最初に両方で
割り切れた数が LCM(i, K)
? これを 1?N のすべてについて行う
? 時間計算量 O(N
2
K)
3/19/15
23. D問題 アルゴリズム (部分点 2)
? 部分点 2 (計 15 点): 1 ≦ N ≦ 10
4
, 1 ≦ K ≦ 100
? LCM(i, K) をもっと速く求めたい
? 「最小公倍数 プログラム」などで検索
? LCM(a, b) = a * b / GCD(a, b) という関係がある
(GCD(a, b) は a と b の最大公約数))
? 「ユークリッドの互除法」というGCDを高速に計算する
方法がある(計算量は O(log(2つのうち小さい方の数)))
が、今回は 1?K を全部試しても可
? 時間計算量 O(N log(K)) または O(NK)
3/19/15