1. 程式人生 > >51Nod 1010 只包含2 3 5的數

51Nod 1010 只包含2 3 5的數

K的因子中只包含2 3 5。滿足條件的前10個數是:2,3,4,5,6,8,9,10,12,15。

所有這樣的K組成了一個序列S,現在給出一個數n,求S中 >= 給定數的最小的數。

例如:n = 13,S中 >= 13的最小的數是15,所以輸出15。

收起

輸入

第1行:一個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 10000)
第2 - T + 1行:每行1個數N(1 <= N <= 10^18)

輸出

共T行,每行1個數,輸出>= n的最小的只包含因子2 3 5的數。

輸入樣例

5
1
8
13
35
77

輸出樣例

2
8
15
36
80

先打表將題目要求的數篩選出來然後再二分查詢大於等於題目給出的數的最小數,或者直接呼叫low_bound。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
typedef unsigned long long ll;
const ll maxn=1e+18+100;
const int maxx=500005;
int n;
ll a[maxx];
ll target;
int Size=0;
void Shai ()
{
    ll i,j,k;
    for (i=1;i<maxn;i*=2)
    {
        for (j=1;i*j<maxn;j*=3)
        {
            for (k=1;i*j*k<maxn;k*=5)
            {
                a[Size++]=i*j*k;
            }
        }
    }
    sort(a,a+Size);
}
void Erfen ()
{
    int l=1,r=Size;
    while (l<r)
    {
        int mid=(l+r)>>1;
        if(a[mid]>=target)
            r=mid;
        else
            l=mid+1;
    }
    printf("%llu\n",a[l]);
}
int main()
{
    Shai();
    scanf("%d",&n);
    while (n--)
    {
        scanf("%llu",&target);
        printf("%llu\n",a[lower_bound(a+1,a+Size,target)-a]);
        //或 Shai ();
    }
    return 0;
}