https://ac.nowcoder.com/acm/contest/11177/C
题意:
给出你 6 i 6^i 6i和 9 i 9^i 9i,然后组成n问最少几张。
分析:
我们采取小于1e7的可以直接打表得到。那么大于1e7的那。大于1e7我们就搜索,是 − 9 i -9^i −9i答案更少还是 − 6 i -6^i −6i更少。最后去个最小值。
map<ll, ll>mp;
ll n,a6[50],a9[50];
int ans[maxn];
void init(){
a6[0]=a9[0]=1;
for(int i=1;i<40;i++){
a6[i]=a6[i-1]*6;
a9[i]=a9[i-1]*9;
}
for(int i=1;i<6;i++){
ans[i]=i;
}
for(int i=6;i<maxn;i++){
ans[i]=maxn;
for(int j=1;j<maxn&&j<=i;j*=6){
ans[i]=min(ans[i],ans[i-j]+1);
}
for(int j=1;j<maxn&&j<=i;j*=9){
ans[i]=min(ans[i],ans[i-j]+1);
}
}
}
int check(ll x){
if(x< maxn) return ans[x];
if(mp[x]) return mp[x];
int k=log(x)/log(9)+1e-8;
int ans1=check(x-a9[k]);
k=log(x)/log(6)+1e-8;
ans1=min(ans1,check(x-a6[k]));
return mp[x] =ans1+1;
}
void solve()
{
cin>>n;
printf("%d\n",check(n));
}