B - 連番チケットの当選 / Winning of Consecutive Number Tickets 解説
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)
投稿日時:
最終更新:
