Code Formula 2014 予選B B - 11の倍数

備忘録

問題

atcoder.jp

回答

import sys
import os
import math
import bisect
import itertools
import collections
import heapq
import queue
import array
import time
import numpy as np
from numpy import linalg as LA

# 時々使う
# import numpy as np
# from decimal import Decimal, ROUND_HALF_UP
# from scipy.sparse.csgraph import csgraph_from_dense, floyd_warshall
# from collections import defaultdict, deque

# 再帰の制限設定
sys.setrecursionlimit(10000000)


def ii(): return int(sys.stdin.buffer.readline().rstrip())
def il(): return list(map(int, sys.stdin.buffer.readline().split()))
def fl(): return list(map(float, sys.stdin.buffer.readline().split()))
def iln(n): return [int(sys.stdin.buffer.readline().rstrip())
                    for _ in range(n)]


def iss(): return sys.stdin.buffer.readline().decode().rstrip()
def sl(): return list(map(str, sys.stdin.buffer.readline().decode().split()))
def isn(n): return [sys.stdin.buffer.readline().decode().rstrip()
                    for _ in range(n)]


def lcm(x, y): return (x * y) // math.gcd(x, y)


# MOD = 10 ** 9 + 7
MOD = 998244353
INF = float('inf')


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    N = iss()

    N = N[::-1]
    even = 0
    odd = 0
    for n in N[::2]:
        odd += int(n)
    for n in N[1::2]:
        even += int(n)
    print(even, odd)


if __name__ == '__main__':
    main()

考え方

11の倍数云々の解説がありますが、
つまるところ奇数番目の数字の和と、偶数番目の数字の和を求める問題です。
Pythonにおいては与えられる数字を文字列として扱って、スライスで偶数番目と奇数番目を抽出すると楽だと思います。

与えられるNは最大で10 ** 1000ですが、
今回の問題では桁数のみに注目するため、最大値が与えられても1回のforは500回程度のループになります。