Official

B - 連番チケットの当選 / Winning of Consecutive Number Tickets Editorial by kyopro_friends


\(x\) の 1 の位が 9 でないとき、\(\mathrm{digitsum}(x+1)=\mathrm{digitsum}(x)+1\) が成り立ちます。

よって、\(x\) の 1 の位が 9 でないとき、
\(\begin{aligned} &\mathrm{digitsum}(x) \bmod K = \mathrm{digitsum}(x+1) \bmod K\\ \iff& \mathrm{digitsum}(x) \bmod K = (\mathrm{digitsum}(x)+1) \bmod K\\ \iff &1 \bmod K = 0 \end{aligned}\)
となります。

\(x\) の 1 の位が 9 のとき、 \(x-1\) の 1 の位は 9 でないので、 \(x-1,x\) について同様に議論することで、問題文中の条件

\(\mathrm{digitsum}(x-1) \bmod K =\mathrm{digitsum}(x) \bmod K = \mathrm{digitsum}(x+1) \bmod K\)

\(1 \bmod K = 0\) と同値であることがわかります。

よって求める答えは \(K\neq 1\) のとき \(0\)\(K=1\) のとき \(N-2\) です。

\(N\) は桁数が非常に大きいため、\(N-2\)\(10^9+7\) で割ったあまりを直接計算することはできません。 \(N\) を文字列として先頭から 1 文字ずつ読み込みながら \(10^9+7\) で割った余りを計算する必要があります。計算量は \(N\) の桁数を \(L\) として \(O(L)\) です。

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
  string N;
  int k, r;
  cin >> N >> k >> r;

  if(k != 1){
    cout << 0 << endl;
  }else{
    int mod = 1000000007;
    long long n = 0;
    for(char c: N){
      n = (n * 10 + (c - '0')) % mod;
    }
    cout << (n - 2 + mod) % mod << endl;
  }
}

実装例 (Python)

N, K, R = input().split()

if int(K) != 1:
  print(0)
else:
  MOD = 10**9 + 7
  n = 0
  for c in N:
    n = (n * 10 + (ord(c) - ord('0'))) % MOD
  print((n-2) % MOD)

posted:
last update: