結果

提出番号 2129
提出者 phyllo
言語 C++
提出日時 2018-08-04 16:08:21
問題名 (72)K-th DigitSum
結果 AC
点数 100%

テストケース

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

ソースコード

#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,n) for(int i=(a); i<(int)(n); i++)
#define rep(i,n) REP(i,0,n)
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it)
#define ALLOF(c) (c).begin(), (c).end()
typedef long long ll;
typedef unsigned long long ull;

static const ll INF = (ll)1e16;

ll dp[2][1005][1005];

ll solve(int top, int m, int N){
  if(dp[top][m][N] != -1) return dp[top][m][N];

  if(m==1){
    if(0 <= N && N <= 9) return dp[top][m][N] = 1;
    return dp[top][m][N] = 0;
  }

  if(top == 1){
    ll ret = 0;
    REP(i,1,10){
      int n = N-i;
      if(n < 0) continue;
      ret += solve(0, m-1, n);
      if(ret > INF) ret = INF;
    }
    return dp[top][m][N] = ret;
  }else{
    ll ret = 0;
    rep(i,10){
      int n = N-i;
      if(n < 0) continue;
      ret += solve(0, m-1, n);
      if(ret > INF) ret = INF;
    }
    return dp[top][m][N] = ret;
  }
}

string ans;
void solve2(int top, int m, int N, int cnt, string num = ""){
  //cout << top << " " << m << " " << N << " " << cnt << " " << num << endl;
  if(ans != "") return;

  if(m==1){
    if(cnt == 1){
      if(0 <= N && N <= 9){
        ans = num + (char)('0' + N);
        return;
      }
    }else{
      return;
    }
  }

  if(top == 1){
    ll ret = 0;
    REP(i,1,10){
      int n = N-i;
      if(n < 0) continue;
      if(ret + solve(0,m-1,n) < cnt){
        ret += solve(0,m-1,n);
      }else{
        solve2(0, m-1, n, cnt-ret, num + (char)('0' + i));
        return;
      }
    }
  }else{
    ll ret = 0;
    rep(i,10){
      int n = N-i;
      if(n < 0) continue;
      if(ret + solve(0,m-1,n) < cnt){
        ret += solve(0,m-1,n);
      }else{
        solve2(0, m-1, n, cnt-ret, num + (char)('0' + i));
        return;
      }
    }
  }
}


int main(){
  int N, K;
  cin >> N >> K;

  rep(i,2) rep(j,1005) rep(k,1005) dp[i][j][k] = -1;

  int m = 0;
  ll cnt = 0;
  ll base = 0;
  REP(i,1,1000){
    ll ret = solve(1, i, N);
    if(K <= base + ret){
      m = i;
      cnt = K - base;
      break;
    }
    base += ret;
  }

  
  ans = "";
  solve2(1, m, N, cnt);
  cout << ans << endl;

  return 0;
}