公式:an + 1 = an + min D igit(an)⋅max D igit(an)a_ {n + 1} = a_n + minDigit(a_n)⋅maxDigit(a_n)aN + 1=an個+m i n D i g i t (an個)⋅m a x D i g i t (an個)
含义:min D igit(an)、an minDigit(a_n)、a_nm i n D i g i t (an個)、an個各小数点以下の最小値。max D igit(an)、maxDigit(a_n)、a_nm a x D i g i t (an個)、an個各小数点以下の最大値。
例:数値83901の最小桁数(an)= 0、最大桁数(an)= 9 minDigit(a_n)= 0、maxDigit(a_n)= 9m i n D i g i t (an個)=0 、m a x D i g i t (an個)=9。
タイトルの意味:1、k a_1、kを与えるa1、Kは式ak a_kに従って計算されますaK
アイデア:最小桁(an)= = 0の場合minDigit(a_n)= = 0m i n D i g i t (an個)==0では、数値全体が変化しなくなります。直接回答を出力できます。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll Max(ll x) {
ll mx = x%10;
x /= 10;
while(x) mx = max(x%10, mx), x /= 10;
return mx;
}
ll Min(ll x) {
ll mi = x%10;
x /= 10;
while(x) mi = min(x%10, mi), x /= 10;
return mi;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
ll n, m, x, y;
scanf("%lld%lld", &n, &m);
for(int i=1; i<m; i++) {
x = Max(n), y = Min(n);
if(y == 0) break;
n = n + x*y;
}
printf("%lld\n", n);
}
return 0;
}