Happy Number
题意 :
开心数是由仅由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
#elsestartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= 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;elsevec[++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();
}