結果

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

テストケース

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

ソースコード

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
#define int long long
int MOD = 1000000007;
int dp[1001][1001];
int N, K;
int rec(int a, int b) {
	if (dp[a][b] != -1)return dp[a][b];
	if (a == 1000) {
		if (b == N) {
			dp[a][b] = 1;
		}
		else {
			dp[a][b] = 0;
		}
	}
	else {
		dp[a][b] = 0;
		for (int i = 0; i < 10; i++) {
			dp[a][b] += rec(a + 1, b + i);
		}
		if (dp[a][b] > K)dp[a][b] = K + 1;
	}
	return dp[a][b];
}
string res;
void rec2(int a, int b, int K2) {
	if (a == 1000) {
		//res.push_back((N - b) + '0');
		return;
	}
	for (int i = 0; i < 10; i++) {
		
		if (K2 - dp[a + 1][b + i] > 0) {
			K2 -= dp[a + 1][b + i];
		}
		else {
			res.push_back(i + '0');
			rec2(a + 1, b + i, K2);
			break;
		}
	}
}
signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	cin >> N >> K;
	for (int i = 0; i <= 1000; i++) {
		for (int j = 0; j <= 1000; j++) {
			dp[i][j] = -1;
		}
	}
	rec(0, 0);
	/*cerr << dp[1000][0] << endl;
	cerr << dp[999][0] << endl;
	cerr << dp[998][0] << endl;*/
	rec2(0, 0, K);
	reverse(res.begin(), res.end());
	while (res.back() == '0')res.pop_back();
	reverse(res.begin(), res.end());
	cout << res << endl;
}