Help us understand the problem. What is going on with this article?

Codeforces #653 (Div. 3) A. Required Remainder

https://codeforces.com/contest/1374/problem/A

概要

  • $x, y, n$が与えられる
  • $0 \leq k \leq n$としたとき、$ k$ $mod$ $x = y $となる最大のkを求めよ
  • 制約: $0 \leq y \lt x$ である $y \leq n \leq 10^{9}$

$10, 5, 187$のとき$k=185$である。187以下で10で割って5になる最大の数は185である。

$5, 0, 4$のとき$k=0$である。4以下で5で割って0になる最大の数は0である。

こう考えた

上の例を考察すると、
- $10, 5, 187$のとき$k=185$である。
- $10, 5, 182$のとき$k=175$である。
ことが分かる。

$x * floor(n / x)$ は$n$を超えないxで割ったときの余りが0の整数だから、
$x * floor(n / x) + y$を計算するとxで割ったときの余りがyの整数なので、答えの1つになりうる。

上記の場合、185がそれに該当する。$n$が185未満の場合、185は許容されないので、それより1つ小さい、10で割ってあまり5が候補になる。
これを考えると、$185 - x = 185 - 10 = 175$である、何故なら、
$x * (floor(n / x) - 1) + y$だからである。

コード

from pprint import pprint
import sys
import math
def do():
    x, y, k = map(int, input().split())
    a = x * (math.floor(k / x))
    a += y
    if a > k:
        a -= x
    print(a)
q = int(input())
for _ in range(q):
    do()

https://codeforces.com/contest/1374/submission/85449747

recuraki
AtCoder(緑/水), Codeforces(水/青)をうろうろ (技術士/CCIE/CISSP/CISM/CISA/一陸技/線路/伝送)
http://www.hogetan.net/note/memo/_resume.html
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away