結果

提出番号 2011
提出者 popo
言語 C++
提出日時 2018-08-04 14:55:27
問題名 (72)K-th DigitSum
結果 WA
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 WA 0% 92ms 116064KB
2 WA 0% 64ms 116048KB
3 WA 0% 47ms 116064KB
4 WA 0% 30ms 116048KB
5 WA 0% 101ms 116064KB
6 WA 0% 113ms 116064KB
7 WA 0% 116ms 116064KB
8 WA 0% 37ms 116048KB
9 WA 0% 102ms 116080KB
10 WA 0% 124ms 116048KB
11 WA 0% 18ms 116048KB
12 WA 0% 36ms 116048KB
13 WA 0% 44ms 116064KB
14 WA 0% 86ms 116080KB
15 WA 0% 119ms 116064KB
16 WA 0% 70ms 116064KB
17 WA 0% 121ms 116048KB
18 WA 0% 102ms 116064KB
19 WA 0% 49ms 116064KB
20 WA 0% 80ms 116080KB
21 WA 0% 84ms 116048KB
22 WA 0% 30ms 116048KB
23 WA 0% 81ms 116064KB
24 WA 0% 23ms 116048KB
25 WA 0% 22ms 116048KB
26 WA 0% 22ms 116048KB
27 WA 0% 105ms 116064KB
28 WA 0% 101ms 116064KB
29 WA 0% 47ms 116048KB
30 WA 0% 97ms 116064KB
31 WA 0% 129ms 116064KB
32 WA 0% 84ms 116048KB
33 WA 0% 72ms 116064KB
34 WA 0% 74ms 116048KB
35 WA 0% 87ms 116080KB
36 WA 0% 108ms 116080KB
37 WA 0% 125ms 116048KB
38 WA 0% 49ms 116048KB
39 WA 0% 96ms 116064KB
40 WA 0% 94ms 116064KB
41 WA 0% 20ms 116048KB
42 WA 0% 87ms 116064KB
43 WA 0% 31ms 116048KB
44 WA 0% 55ms 116048KB
45 WA 0% 103ms 116064KB
46 WA 0% 57ms 116064KB
47 WA 0% 22ms 116048KB
48 WA 0% 24ms 116048KB
49 WA 0% 77ms 116048KB
50 WA 0% 31ms 116048KB
51 AC 100% 14ms 116080KB

ソースコード

#include <bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;

struct X{
  int id,su,di;
  X(){di=-1;}
  X(int a,int c){
    id=a;

    su=c;
    
  }
};


int dp[1002][1009],n,k;
X pre[1002][1009],p[1002][1009];

int prin1(int a,int c){
  string ans="";
  int a1=a,c1=c,d,d1;
  while(a!=1001){
    int A=pre[a][c].id;

    int C=pre[a][c].su;
    int D=abs(c-C);
    a=A;

    c=C;
    d=D;
    ans+=('0'+d);
  }
  //reverse(ans.begin(),ans.end());
  while(1){
    if(c1==0)break;
    int A=p[a1][c1].id;

    int C=p[a1][c1].su;
    int D=abs(c1-C);
    a1=A;

    c1=C;
    d1=D;
    ans+=('0'+d1);
  }
  reverse(ans.begin(),ans.end());
  cout<<ans<<endl;
  exit(0);
}

int dfs1(int idx,int sum=0){
  if(idx==1001)return sum==n;
  int &res=dp[idx][sum];
  if(~res)return res;
  res=0;
  for(int i=0;i<=9;i++){
    if(sum+i>n)continue;
    p[idx+1][sum+i]=X(idx,sum);
    res+=dfs1(idx+1,sum+i);
    pre[idx][sum]=X(idx+1,sum+i);
    if(res==k){
      prin1(idx,sum);
    }
  }
  return dp[idx][sum]=res;
}

int prin(int a,int c){
  string ans="";
  int a1=a,c1=c,d,d1;
  while(a!=1001){
    int A=pre[a][c].id;

    int C=pre[a][c].su;
    int D=abs(c-C);
    a=A;

    c=C;
    d=D;
    ans+=('0'+d);
  }
  //reverse(ans.begin(),ans.end());
  while(1){
    if(c1==0)break;
    int A=p[a1][c1].id;

    int C=p[a1][c1].su;
    int D=abs(c1-C);
    a1=A;

    c1=C;
    d1=D;
    ans+=('0'+d1);
  }
  reverse(ans.begin(),ans.end());
  int idx=0;
  while(ans[idx]=='0')idx++;
  ans=ans.substr(idx);
  k=(int)ans.size()-k+1;
  memset(dp,-1,sizeof(dp));
  dfs1(0);
  exit(0);
}


int dfs(int idx,int sum=0){
  if(idx==1001)return sum==n;
  int &res=dp[idx][sum];
  if(~res)return res;
  res=0;
  for(int i=0;i<=9;i++){
    if(sum+i>n)continue;
    p[idx+1][sum+i]=X(idx,sum);
    res+=dfs(idx+1,sum+i);
    pre[idx][sum]=X(idx+1,sum+i);
    if(res==12+1){
      prin(idx,sum);
    }
  }
  return dp[idx][sum]=res;
}

int main(){
  memset(dp,-1,sizeof(dp));
  cin>>n>>k;
  dfs(0);
}