D=0 1,2,3,.... D=1 100,200,300,... D=2 10000,20000,30000,...
基本的に、100で(ちょうどでなくても良いので)$D$ 回割り切れる $N$ 番目の数は、$100^D\times N$ となる。
この内、100で割り切りすぎてしまう($D$ 回以上になってしまう)のは、$N$ が100の倍数の時。制約内では $N=100$ の時のみ。
d, n = map(int, input().split()) if n == 100: n += 1 print(n * 100 ** d)
2つの数を1操作で同時に2で割るなら、1回ずつの操作に分けた方が操作回数は増える。1回の操作で最小限の1つの数のみ2で割れば、操作可能な回数は、それぞれの数が2で割れる回数の合計となる。
from math import log n = int(input()) aaa = list(map(int, input().split())) ans = 0 for a in aaa: ans += log(a & -a, 2) print(int(ans))
$M$ 個のケーキの、たとえば「おいしさ」の合計が負だったとする。
最終的に絶対値をとるので、最初から各ケーキの「おいしさ」の値だけ正負反転させていても「おいしさの合計の絶対値」は変わらない。また「綺麗さ」「人気度」にも影響は無い。
なので、最終的に「綺麗さ」「おいしさ」「人気度」の合計がそれぞれ正負どちらになるか、8通りを試せばよい。
配列の要素を転置したり-1をかけたりするのでNumpy使ったけど、何かあんまり綺麗じゃない。
import numpy as np def calc(xyz, m): srt = sorted(sum(cake) for cake in xyz) return sum(srt[-m:]) def solve(xyz, m): if m == 0: return 0 xyzT = xyz.T ans = calc(xyz, m) xyzT[2] *= -1 ans = max(ans, calc(xyzT.T, m)) xyzT[2] *= -1 xyzT[1] *= -1 ans = max(ans, calc(xyzT.T, m)) xyzT[2] *= -1 ans = max(ans, calc(xyzT.T, m)) xyzT[2] *= -1 xyzT[1] *= -1 xyzT[0] *= -1 ans = max(ans, calc(xyzT.T, m)) xyzT[2] *= -1 ans = max(ans, calc(xyzT.T, m)) xyzT[2] *= -1 xyzT[1] *= -1 ans = max(ans, calc(xyzT.T, m)) xyzT[2] *= -1 ans = max(ans, calc(xyzT.T, m)) return ans n, m = map(int, input().split()) xyz = np.array([list(map(int, input().split())) for n in range(n)]) print(solve(xyz, m))