A - Sequence with Digits

题意:由递推式 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 ) minDigit(a_n) minDigit(an​), m a x D i g i t ( a n ) maxDigit(a_n) maxDigit(an​)分别为 a n a_n an​中最小的一位数和最大的一位数,求 a k a_k ak​的值。
做法:题目的数据范围非常大,显然直接暴力是不可取的。对于这种递推式的题,有时结果会有一定的规律性,可以打表肉眼观察,也可以通过严格的数学推理证明。在本题中,我使用了打表的方法,不难看出当k达到一定值时结果不会发生改变,因为最小的一位是0,0乘任何数都得0,所以结论就很显然了。由于本人数论水平较低,就不通过数学推理证明了,据说 codeforces上有严格的证明,有兴趣的同学自行查看。
代码:

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair <int, int> PII;
const int N = 1e5 + 10;
const ll mod = 1e9 + 7;
int t;
ll n, k;
int main() {
	cin >> t;
	while(t--) {
		cin >> n >> k;
		for(int i = 1; i <= min(k - 1, 1000ll); i++) {
			ll tmp = n, maxn = 0, minn = 9;
			while(tmp) {
				maxn = max(maxn, tmp % 10);
				minn = min(minn, tmp % 10);
				tmp /= 10;
			}
			n += maxn * minn;
		}
		printf("%lld\n", n);
	}
	return 0;
}
上一篇:递推:【NOIP2006PJ】数列(sequence)


下一篇:CF438D The Child and Sequence(线段树区间取模)