CF1249C2-Good Numbers (hard version)

题目:https://vjudge.net/problem/CodeForces-1249C2

分析:转为三进制数后,从高位往低位找到第一个为2的位置h,再从此位置向高位找到第一个为0的位置k,将k位改为1并舍去低位的所有数,此时必然比原数大且满足要求,运用快速幂输出即可。

#include <stdio.h>
#include <string.h>
typedef long long ll;
ll a[200];
ll quickpow(ll base,ll b){//快速幂
    ll ans=1;
    while(b){
        if(b&1)ans*=base;
        base*=base;
        b>>=1;
    }
    return ans;
}
int main(void){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(a,0,sizeof(a));
        ll n;
        scanf("%lld",&n);
        ll r=0,n2=n;
        while(n>0){
            a[r++]=n%3;
            n/=3;
        }
        ll h=r-1;
        for(;h>=0;h--){
            if(a[h]==2)
            break;
        }
        if(h==-1)
        printf("%lld
",n2);
        else{
        ll k=h+1;
        for(;k<=r-1;k++){
            if(a[k]==0){
                a[k]=1;
                break;
            }
        }
        ll sum=0;
        if(k==r)a[r]=1;//不存在为0的位只能最高位进1
        for(ll j=k;j<=r;j++){
            if(a[j]==1)
            sum+=quickpow(3,j);
        }
        printf("%lld
",sum);
    }
}
return 0;
} 
终究独木难支。
原文地址:https://www.cnblogs.com/yanying7/p/12266298.html