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