设这个数为num

so, num=2^x * 3^y  *  5^z

可以掐算一下x,y,z的最大值

x最大在60左右 y,z肯定小于60 但我们当它是60

所以我们可以推断num个数约为60*60*60 <2e5

然后打表排序

二分查找

 

顺便

 

升序排列:
iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。
降序排列:
iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值<= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值< key的第一个元素。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

const int maxn=2e5+120;
const ll nummax=1e18+1000;
ll table[maxn];
int cnt=0;

int main()
{
	for(ll i=1;i<nummax;i*=2)
	{
		for(ll j=1;i*j<nummax;j*=3)
		{
			for(ll k=1;i*j*k<nummax;k*=5)
			{
				table[cnt++]=i*j*k;
			}
		}
	}
	int t;
	scanf(\"%d\",&t);
	sort(table,table+cnt);
	while(t--)
	{
		ll n;
		scanf(\"%lld\",&n);
		int pos=lower_bound(table+1,table+cnt,n)-table-1;
		printf(\"%lld\\n\",table[pos+1]);
	}
} 

 

收藏 打印