>Link
ybtoj他的世界
>Description
条件:一个数在三进制下1的个数与2的个数相同
求出不小于 n 的 m 个最小的符合条件的数
n ≤ 1 0 6 , m ≤ 100 n\le 10^6,m\le 100 n≤106,m≤100
>解题思路
直接暴力就可以过
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 30
#define LL long long
using namespace std;
int T, m, cnt[5], a[N], last;
LL p[N], n, k;
void work ()
{
scanf ("%lld%d", &n, &m);
memset (a, 0, sizeof (a));
memset (cnt, 0, sizeof (cnt));
last = n - 1, k = n;
for (int i = 20; i >= 0; i--)
if (k >= p[i])
a[i] = k / p[i], cnt[a[i]]++, k %= p[i];
for (int i = 1; i <= m; i++)
{
while (cnt[1] != cnt[2] || n == last)
{
memset (cnt, 0, sizeof (cnt));
n++;
k = n;
for (int i = 20; i >= 0; i--)
if (k >= p[i])
a[i] = k / p[i], cnt[a[i]]++, k %= p[i];
}
printf ("%lld ", n);
last = n;
}
printf ("\n");
}
int main()
{
freopen ("number.in", "r", stdin);
freopen ("number.out", "w", stdout);
p[0] = 1;
for (int i = 1; i <= 20; i++)
p[i] = p[i - 1] * (LL)3;
scanf ("%d", &T);
while (T--)
work ();
return 0;
}