AtCoder が提供しているABC(AtCoder Beginner Contest)357 D問題をC++とPythonで解いてみました。ABC357は、2024年6月8日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
D問題 88888888(Difficulty : 970)
問題の詳細は、リンク先をご覧ください。
等比数列の和を求めることに帰着します。AtCoder Problems による Difficulty は 970 でした。
解答案
入力例1の場合を分析します。3を3個つなげた333は、以下と考えることができます。
初項
与えられた
高校数学(数学Bで履修します)の復習となりますが、この等比数列の和は、以下となります。
C++ プログラム例(ABC357D)
プログラムを補足します。
- 与えられた
の桁数 を求めます(14ー19行目)。 - 変数 t を
とします(21行目)。 - 等比数列の和の公式を適用します(22行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using namespace atcoder;
typedef long long int ll;
typedef modint998244353 mint;
int main()
{
ll n;
cin >> n;
ll k = 0;
ll tn = n;
while (tn > 0) {
++k;
tn /= 10;
}
mint t = ((mint)10).pow(k);
mint result = (mint)n * (t.pow(n) - (mint)1) / (t - (mint)1);
cout << result.val() << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC357D)
Python 版も基本的な考え方は同じです。組込み関数 pow で mod 付きの累乗を求めることができます(12、13行目)。以下となります。
"""AtCoder Beginner Contest 357 D"""
MOD = 998244353
n = int(input())
k = 0
tn = n
while tn > 0:
k += 1
tn //= 10
t = (10 ** k) % MOD
inv = pow(t - 1, MOD - 2, MOD)
result = n * (pow(t, n, MOD) - 1) * inv
result %= MOD
print(result)
こちらも「AC」と判定されました。
最後に
等差数列と等比数列の知識を使う問題は、ときどき出題される気がします。
引き続き ABC の問題を紹介していきます。