题意 :
开心数是由仅由2,3,6组成的,问第n个开心数是哪个?
1<=n<=1e9
题解:
正解应该是:
首先确定k大数有几位:
然后就知道k大数是x位下的第k’大的
把2看成0,3看成1,6看成2
问题就变成三进制数转换
我第一反应其实就是3进制,只不过用2,3,6代替了0,1,2,然后我就直接开始求n的三进制,发现不大对,我手写列举一部分,2,3,6,22,23,26…,22在三进制中是00,23代表的是01,说明这里的三进制应该是:0,1,2,00,01,02,10,11,12…
00挺别扭,我就想分别用1,2,3表示,就是:1,2,3,11,12,13,21,22,23…
第7个数是21,第8个数是22,分别就是7和8的三进制,第9个数的三进制是30,但是我们规定了是1,2,3没有0,所以减一就是23.这样答案就出来了
代码:
// Problem: Happy Number
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11260/H
// Memory Limit: 1048576 MB
// Time Limit: 2000 ms
// Data:2021-08-14 12:11:25
// By Jozky
#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{
T f= 1;
x= 0;
char ch= getchar();
while (0 == isdigit(ch)) {
if (ch == '-')
f= -1;
ch= getchar();
}
while (0 != isdigit(ch))
x= (x << 1) + (x << 3) + ch - '0', ch= getchar();
x*= f;
}
template <typename T> inline void write(T x)
{
if (x < 0) {
x= ~(x - 1);
putchar('-');
}
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
startTime= clock();
freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
endTime= clock();
printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 6e6 + 9;
int vec[maxn];
int tot= 0;
void solve(ll n)
{
while (n) {
if (n % 3 == 0)
vec[++tot]= 3, n-= 3;
else
vec[++tot]= n % 3;
n/= 3;
}
for (int i= tot; i >= 1; i--) {
if (vec[i] == 1)
printf("%d", 2);
if (vec[i] == 2)
printf("%d", 3);
if (vec[i] == 3)
printf("%d", 6);
}
}
int main()
{
//rd_test();
ll n;
cin >> n;
solve(n);
return 0;
//Time_test();
}