結果

提出番号 2120
提出者 phyllo
言語 C++
提出日時 2018-08-04 15:43:33
問題名 (72)K-th DigitSum
結果 WA
点数 0%

テストケース

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

ソースコード

#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;
  }
}

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

  if(m==1){
    if(0 <= N && N <= 9){
      ans = num * 10 + N;
      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*10 + i);
        break;
      }
    }
  }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*10 + i);
        break;
      }
    }
  }
}


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;
    }
  }

  ans = -1;
  solve2(1, m, N, cnt);
  cout << ans << endl;
  
  return 0;
}