他的世界【暴力】

>Link

ybtoj他的世界


>Description

条件:一个数在三进制下1的个数与2的个数相同
求出不小于 n 的 m 个最小的符合条件的数

n ≤ 1 0 6 , m ≤ 100 n\le 10^6,m\le 100 n106,m100


>解题思路

直接暴力就可以过


>代码

#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;
}

おすすめ

転載: blog.csdn.net/qq_43010386/article/details/121307034