C1. Good Numbers (easy version)
Good Numbers (hard version)
题意:给出一个x要求找到一个y>=x符合y是一个好数(可以分解为3的不同次数之和,例如 4=3的一次+3的0次)
easy version --暴力枚举
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll bz[30];
int main()
{
int tt;cin>>tt;bz[0]=1,bz[1]=3;
for(int i=2;i<=9;i++)
{
bz[i]=bz[i-1]*3;
}//cout<<bz[8]<<" "<<bz[7]<<endl;
vector<int>v;
int f[20]={0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};
do{
int s=0;
for(int i=0;i<=9;i++)
{
if(f[i]==1)
{
s+=bz[i];
}
}
v.push_back(s);
}while(next_permutation(f,f+20));
// cout<<bz[8];
sort(v.begin(),v.end());
while(tt--)
{
int n;cin>>n;
int pos=lower_bound(v.begin(),v.end(),n)-v.begin();
cout<<v[pos]<<endl;
}
}
hard --考虑转变为三进制
从高位到低位
1.如果存在某一位大小为2 也就不符合规定了,于是就上去找高位中为0 的位数 ,并把大小改为1, 累加从最高位到这一位就是答案了。。
2.如果不存在这个为2 的位数,就是说这个数本身就是一个好数
码风过于choulou
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll qpow(ll n,ll a)
{
ll ans=1ll;
while(a)
{
if(a&1) ans=ans*n;
a>>=1;
n=n*n;
}
return ans;
}
int main()
{
int tt;cin>>tt;
while(tt--)
{
ll n;cin>>n;
int p[40]={0};
int tot=0;
ll r=n;
while(n)
{
p[tot++]=n%3;
n/=3;
}
int now=-1;
for(int i=tot-1;i>=0;i--)
{
if(p[i]>1)
{
now=i;
break;
}
}
ll ans=0;
if(now==-1)
{
cout<<r<<endl;
continue;
}
int ok=0;
if(now!=-1)
{
for(int i=now+1;;i++)
{
if(p[i]==0)
{
p[i]=1;ok=i;
if(i==tot)
{
ans=qpow(3,tot);
}
break;
}
}
}
if(!ans)
for(int i=tot-1;i>=ok;i--)
{
if(p[i]==1)
{
ans+=qpow(3,i);
}
}
cout<<ans<<endl;
}
}