Codeforces Round #387 (Div. 2), problem: (F) Igor and Interesting Numbers Solution in C/C++

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

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *