好数(GCOI2020六5) 描述
在一张无穷大的桌面上,从左往右摆放着无穷张卡片,卡片的编号是0至无穷,第k张卡片的价值是3的k次方(即3k)。
对于一个正整数n来说,如果可以从桌面上选出若干张不同的卡片,选出来的卡片的价值总和等于n,那么n就称为“好数”。
例如:3是“好数”,因为3 = 3^1。
1是“好数”,因为1 = 3^0。
12是“好数”,因为12 = 3^2+ 3^1。
但2不是“好数”,虽然2 =3^0+3^0, 但是3^0和3^0是相同的卡片,不符合要求。
同理,19和20都不是“好数”。
给出一个正整n,你要找到一个最小的“好数”m,要满足m>=n,输出m。
输入
一行,一个整数n。 1<=n<=1000000000000000000。
输出
一个整数m。
输入格式 无
输出格式 无
输入/输出例子1 输入:14
输出:27
样例解释
【提示】
对于80%的数据,n<=100。
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n;
bool check(long long x)
{
while(x)
{
if(x%3==2) return false;
x/=3;
}
return true;
}
int main() {
cin>>n;
while(!check(n)) n++;
cout<<n;
return 0;
}
代码上面的函数是判断好数的(听说这道题要用二分,具体也不知道要怎么做)(代码80分超时)