問題
https://codeforces.com/contest/1288/problem/B
問題概要
conc(a, b)
を、aとbを連結したものを返す関数として定義する。例えばconc(12,23) = 1223
であり、conc(100,11) = 10011
である。
2つの正の整数A, Bが与えられるので、1 <= a <= A, 1 <= b <= B
であるa, bの組のうち、a * b + a + b = conc(a, b)
を満たすものの個数を答えよ。
考察
式変形をしていきます。
まず関数concは(|b|はbの文字数とする)と表すことができます。
なのでとなります。
両辺に+ b
があるので取っ払ってです。
左辺をaでくくるととなり、両辺をaで割ると(aは正数なので大丈夫です)となります。
ここで、式を成り立たせるためにaの値は実はなんでもいいことがわかります。また、右辺は10のべき乗であり、bは9, 99, 999のような数のみ取りうることがわかります。
よって答えるべき組み合わせの数は、Aと、B以下ですべての桁が9である数の個数をかけ合わせたものとなります。
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { long long a; string b; cin >> a >> b; long long l = b.size(); for (char c : b) { if (c != '9') { l--; break; } } cout << a * l << endl; } }