結果

提出番号 1810
提出者 amano
言語 C++
提出日時 2018-08-04 14:00:58
問題名 (72)K-th DigitSum
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 41ms 43632KB
2 AC 100% 44ms 43648KB
3 AC 100% 31ms 43648KB
4 AC 100% 20ms 43632KB
5 AC 100% 48ms 43632KB
6 AC 100% 57ms 43648KB
7 AC 100% 43ms 43632KB
8 AC 100% 24ms 43648KB
9 AC 100% 56ms 43648KB
10 AC 100% 49ms 43632KB
11 AC 100% 18ms 43632KB
12 AC 100% 22ms 43648KB
13 AC 100% 29ms 43648KB
14 AC 100% 45ms 43632KB
15 AC 100% 43ms 43632KB
16 AC 100% 42ms 43648KB
17 AC 100% 49ms 43632KB
18 AC 100% 53ms 43648KB
19 AC 100% 27ms 43648KB
20 AC 100% 46ms 43632KB
21 AC 100% 44ms 43648KB
22 AC 100% 21ms 43648KB
23 AC 100% 37ms 43648KB
24 AC 100% 20ms 43648KB
25 AC 100% 18ms 43648KB
26 AC 100% 19ms 43632KB
27 AC 100% 43ms 43632KB
28 AC 100% 58ms 43648KB
29 AC 100% 22ms 43632KB
30 AC 100% 56ms 43648KB
31 AC 100% 55ms 43648KB
32 AC 100% 37ms 43648KB
33 AC 100% 40ms 43648KB
34 AC 100% 38ms 43632KB
35 AC 100% 41ms 43632KB
36 AC 100% 52ms 43648KB
37 AC 100% 52ms 43632KB
38 AC 100% 32ms 43648KB
39 AC 100% 52ms 43632KB
40 AC 100% 43ms 43632KB
41 AC 100% 18ms 43648KB
42 AC 100% 39ms 43648KB
43 AC 100% 21ms 43632KB
44 AC 100% 32ms 43648KB
45 AC 100% 51ms 43648KB
46 AC 100% 31ms 43648KB
47 AC 100% 19ms 43648KB
48 AC 100% 22ms 43648KB
49 AC 100% 44ms 43648KB
50 AC 100% 23ms 43648KB
51 AC 100% 20ms 43648KB

ソースコード

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,k,n) for(int i = (int)(k); i < (int)(n); i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(a) a.begin(), a.end()
#define MS(m,v) memset(m,v,sizeof(m))
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1e9 + 7;
template<class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template<class T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template<class T>
istream& operator >> (istream& is, vector<T>& v)
{
	for (auto &i : v) is >> i;
	return is;
}
template<class T>
ostream& operator<<(ostream& os, vector<T>& v)
{
	const string delimiter = "\n";
	REP(i, v.size())
	{
		os << v[i];
		if (i != v.size() - 1) os << delimiter;
	}
	return os;
}
/*--------------------template--------------------*/

int L = 1001;

string add(string &a, string &b)
{
	string res(L, '0');
	int f = 0;
	REP(i, L)
	{
		int aa = a[L - i - 1] - '0', bb = b[L - i - 1] - '0';
		int c = aa + bb + f;
		res[L - i - 1] = c % 10 + '0';
		f = c / 10;
	}
	return res;
}
//
//string mean(string &a, string &b)
//{
//
//}
//
//string remz(string &a)
//{
//
//}

ll INF = 1e10;

int n, k;
ll dp[1111][1111];

ll solve1(int p, int sum, int& keta)
{
	if (p == keta) return sum == n;
	if (sum > n) return 0;
	if (dp[p][sum] >= 0) return dp[p][sum];
	ll res = 0;
	REP(i, 10)
	{
		res += solve1(p + 1, sum + i, keta);
	}
	chmin(res, INF);
	return dp[p][sum] = res;
}

ll count1(int keta)
{
	MS(dp, -1);
	return solve1(0, 0, keta);
}

string solve2(int keta)
{
	string res(keta, '.');
	int sum = 0;
	ll tmp = 0;
	REP(i, keta)
	{
		int c;
		for (c = 0; c < 10; ++c)
		{
			ll x = solve1(i + 1, sum + c, keta);
			if (tmp + x >= k)
			{
				break;
			}
			tmp += x;
		}
		assert(c >= 0 && c <= 9);
		sum += c;
		res[i] = c + '0';
	}
	return res;
}

int main()
{
	cin.sync_with_stdio(false); cout << fixed << setprecision(10);
	cin >> n >> k;
	int lb = 0, ub = 1001;
	while (ub - lb > 1)
	{
		MS(dp, -1);
		int mid = (lb + ub) / 2;
		if (count1(mid) >= k) ub = mid;
		else lb = mid;
	}
	MS(dp, -1);
	cout << solve2(ub) << endl;
	return 0;
}