LoginSignup
0
1

More than 3 years have passed since last update.

yukicoder contest 267 参戦記

Last updated at Posted at 2020-09-25

yukicoder contest 267 参戦記

A 1236 長針と短針

12時間の間に長針と短針は11回巡り合う. 当然巡り合うのは12時間の秒数を11で割った秒数毎である. その秒数を求めると、現在時刻の次のその秒数との差が答えとなる.

from bisect import bisect_left

A, B = map(int, input().split())

x = [i * 12 * 60 * 60 // 11 for i in range(12)]
t = (A * 60 + B) % (12 * 60) * 60
print(x[bisect_left(x, t)] - t)

B 1237 EXP Multiple!

よく読むと「答えを109+7で割った余り」じゃなくて、「答えで109+7を割った余り」かよ orz. 確かにそれなら簡単に解ける. 解いた人数からしてこれに引っ掛かった人が多数だな(笑).

m = 1000000007


def make_factorial_table(n):
    result = [0] * (n + 1)
    result[0] = 1
    for i in range(1, n + 1):
        result[i] = result[i - 1] * i % m
    return result


N, *A = map(int, open(0).read().split())

A.sort()

if A[0] == 0:
    print(-1)
    exit()

if A[-1] >= 4:
    print(m)
    exit()

fac = make_factorial_table(3)

t = 1
for a in A:
    t *= pow(a, fac[a])
    if t > m:
        break
print(m % t)

C 1238 選抜クラス

K を引いた辺りで、「あれ、同じような問題を過去に解いてるぞ」と思ったのに解けなかった悲しみ. ABC044C - 高橋君とカード と大体同じですね(平均がちょうどXか、平均がX以上かの違い).

ai=Ai-K とすると、aiの合計が0以上になる選び方はいくつあるかという問題になる. DP をすれば簡単に求まる.

m = 1000000007

N, K, *A = map(int, open(0).read().split())

for i in range(N):
    A[i] -= K

dp = {}
dp[0] = 1
for a in A:
    for k in sorted(dp, reverse=True) if a >= 0 else sorted(dp):
        dp.setdefault(k + a, 0)
        dp[k + a] += dp[k]

dp[0] -= 1
print(sum(dp[k] for k in dp if k >= 0) % m)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1