CF2132C1

Solution

想要购买的次数最小,很明显每次购买的要最多。
那么我们可以先预处理出 $3$ 的幂,然后从大到小,能买大一点的 $x$ 就尽量买,把答案加起来就好了。

Code

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
using LL=long long;
LL g[25]={1};
void solve(){
    LL x,ans=0;
    cin>>x;
    for(int i=20;i>=0;i--){
        while(x>=g[i]){
            x-=g[i];
            if(i)ans+=g[i+1]+i*g[i-1];
            else ans+=g[i+1];
        }
    }
    cout<<ans<<endl;
}
int main() {
    for(int i=1;i<=20;i++) g[i]=3ll*g[i-1];
    int t;
    cin>>t;
    while(t--) solve();
    return 0;
}