题意: 判断一个数n,(1<=n<=500),将n写成:3 ^ x1 + 3 ^ x2 + 3 ^ x3 +…+ 3 ^ xi 的形式。若x1,x2,x3…xi不重复,那么就称n是一个好数,输出n。若n不是一个好数,就输出大于n的最小好数。
思路:假设每个数n都写成3 ^ x1 + 3 ^ x2 + 3 ^ x3 +…+ 3 ^ xi 的形式,若xi没有重复,则反复令n/=3,每次n%3得到的都应该是0或者1。反之,若n不是好数,则在n/=3的过程中,一定会出现n%3=2的情况,籍此可以作为判断依据。
例如:


代码
#include<stdio.h>
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
while(1)
{
int flag=1,m=n;
while(m)
{
if(flag&&m%3==2)
flag=0;
m/=3;
}
if(flag) break;
n++;
}
printf("%d\n",n);
}
return 0;
}
Good Numbers (hard version)
标程思路是:先设一sum=1+3+9+…+3^k>n,然后令sum-3 ^ k,(k- -)找到最小的满足题意的sum即为所求。
#include<stdio.h>
#include<string.h>
#define ll long long
int main()
{
ll t,n;
scanf("%lld",&t);
while(t--)
{
ll x=1,y=0;
scanf("%lld",&n);
while(y<=n)
{
y+=x;
x*=3;
}
while(x)
{
if(y-x>=n)
y-=x;
x/=3;
}
printf("%lld\n",y);
}
return 0;
}
本文探讨了如何判断一个数是否能表示为不重复的3的幂次之和,并找出大于该数的最小好数。通过分析好数的性质,提出了一种高效算法,利用3的幂次和的特性进行快速查找。

656

被折叠的 条评论
为什么被折叠?



