結果
| 問題 | No.315 世界のなんとか3.5 |
| コンテスト | |
| ユーザー |
Min_25
|
| 提出日時 | 2015-12-08 15:55:55 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 355 ms / 2,000 ms |
| コード長 | 1,718 bytes |
| 記録 | |
| コンパイル時間 | 177 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 11,648 KB |
| 最終ジャッジ日時 | 2024-09-14 20:11:31 |
| 合計ジャッジ時間 | 6,197 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 36 |
ソースコード
def prob315():
MOD = 10 ** 9 + 7
def count(A, p, e, inclusive, MOD=MOD):
prefix = 0
has3 = False
f, s = 0, 0
mid = max(0, len(A) - 4 - e)
for i in range(mid): # xrange
d = ord(A[i]) - 0x30
f = (f * 10 + s) % MOD
s = (s * 9) % MOD
if has3:
f = (f + d) % MOD
else:
s = (s + d - (d > 3)) % MOD
f = (f + (d > 3)) % MOD
prefix = (prefix + d) % 3
has3 |= d == 3
p3 = 3 * p
curr = [0] * (4 * p)
curr[0] = curr[1] = curr[2] = s * pow(3, MOD - 2, MOD) % MOD
curr[p3] = f
for i in range(mid, len(A)):
next = [0] * (4 * p)
d = ord(A[i]) - 0x30
for r in range(p3):
if not curr[r]: continue
for j in range(10):
k = (p3 + (r * 10 + j) % p) if j == 3 else (r * 10 + j) % p3
next[k] = (next[k] + curr[r]) % MOD
for r in range(p):
if not curr[p3 + r]: continue
for j in range(10):
k = p3 + (r * 10 + j) % p
next[k] = (next[k] + curr[p3 + r]) % MOD
for j in range(d):
k = p3 + (prefix * 10 + j) % p if (j == 3 or has3) else (prefix * 10 + j) % p3
next[k] = (next[k] + 1) % MOD
prefix = (prefix * 10 + d) % p3
has3 |= d == 3
curr = next
if inclusive:
k = p3 + prefix % p if has3 else prefix
curr[k] = (curr[k] + 1) % MOD
ret = sum(c for i, c in enumerate(curr[:p3]) if i % 3 == 0 and i % p != 0)
ret += sum(curr[p3+1:])
return ret % MOD
import sys
rl = sys.stdin.readline
A, B, P = rl().split()
P = int(P)
e = 0
while P % 10 ** (e + 1) == 0:
e += 1
a = count(A, P, e, False)
b = count(B, P, e, True)
print((b - a) % MOD)
prob315()
Min_25