题目: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; }