公式: a n + 1 = a n + m i n D i g i t ( a n ) ⋅ m a x D i g i t ( a n ) a_{n+1}=a_n+minDigit(a_n)⋅maxDigit(a_n) an+1=an+minDigit(an)⋅maxDigit(an)
含义: m i n D i g i t ( a n ) , a n minDigit(a_n),a_n minDigit(an),an的每个十进制位置上的最小值。 m a x D i g i t ( a n ) , a n maxDigit(a_n),a_n maxDigit(an),an的每个十进制位置上的最大值。
举例:数83901的 m i n D i g i t ( a n ) = 0 , m a x D i g i t ( a n ) = 9 minDigit(a_n) = 0,maxDigit(a_n) = 9 minDigit(an)=0,maxDigit(an)=9。
题意:给出 a 1 , k a_1,k a1,k根据公式求 a k a_k ak
思路:当 m i n D i g i t ( a n ) = = 0 minDigit(a_n) = =0 minDigit(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;
}