Official
L - のびたす Editorial
by
L - のびたす Editorial
by
kaage
「\(X\) のびたす \(Y\)」は、\(Y\) の \(10\) 進表記での桁数を \(|Y|\) とすると、\(X(10^{|Y|})+Y\) と計算できます。
\(S_i\) を、\(A_i\) までの演算の仕方 \(2^i\) 通りすべての結果の和と定義すると、
\[S_{i+1}=(S_i+1)(10^{|A_{i+1}|})+2^{i+1}A_{i+1}\]
が成り立つので、これに従って順に計算していけばよいです。
#include <iostream>
#include <atcoder/modint>
#define rep(i, n) for (int i = 0; i < int(n); i++)
using lint = long long int;
template <class T>
T mypow(T a, lint b) {
T res(1);
while (b) {
if (b & 1) res *= a;
a *= a;
b >>= 1;
}
return res;
}
using ModInt = atcoder::modint1000000007;
std::istream& operator>>(std::istream& ist, ModInt& x) {
lint a;
ist >> a;
x = a;
return ist;
}
int Q, A[100010];
ModInt x;
int main() {
std::cin >> Q >> x;
rep(i, Q) {
std::cin >> A[i];
x = x * (mypow(ModInt(10), std::to_string(A[i]).size()) + 1) + mypow(ModInt(2), i + 1) * A[i];
}
std::cout << x.val() << std::endl;
return 0;
}
posted:
last update:
