Codeforces Round #387 (Div. 2), problem: (F) Igor and Interesting Numbers Solution in C/C++
#include <bits/stdc++.h> #define ll long long using namespace std; const int N=1<<16; int k,t,len; ll c[200][200]; void print(int x) { x--; if(x<10) cout<<x; else cout<<char('a'+x-10); } ll dp[20][200]; int cnt[20]; ll cal(int len,int d=0) { for(int i=0;i<=len;i++) for(int j=0;j<=16;j++) dp[j][i]=0; dp[0][len]=1; for(int i=1;i<=16;i++) { for(int j=0;j<=len;j++) { if(dp[i-1][j]==0) continue; for(int k=0;k<=cnt[i];k++) { if(j<k) break; dp[i][j-k]+=dp[i-1][j]*c[j][k]; } } } if(d==1) return dp[16][0]/16*15; return dp[16][0]; } int main() { for(int i=0;i<200;i++) c[i][0]=1; for(int i=1;i<200;i++) for(int j=1;j<=i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1]; cin>>k>>t; for(int i=1;i<=16;i++) cnt[i]=t; for(len=1;;len++) { ll tmp=cal(len,1); if(tmp>=k) break; k-=tmp; } for(int i=1;i<=len;i++) { for(int j=1;j<=16;j++) { if(i==1&&j==1) continue; cnt[j]--; ll tmp=cal(len-i); if(tmp>=k) { print(j); break; } k-=tmp; cnt[j]++; } } }