hdu5878 dfs

来源:互联网 发布:单片机工作过程 编辑:程序博客网 时间:2024/06/06 00:00


http://acm.hdu.edu.cn/showproblem.php?pid=5878


题意: 对于一个n,找到一个的数刚好大于等于n数,输出;数据范围10e9;

dfs打表,为了避免出现2 * 2 * 3 * 2      2 * 2 * 2 * 3重复的情况,打表的时候注意技巧

之后二分;


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cctype>#include <stack>#include <queue>#include <cmath>#include <algorithm>#include<map>#include<cstring>#include<cmath>using namespace std;typedef long long ll;const int maxn = 1000000;#define INF 0x3f3f3f3fll a[maxn];int len ;void dfs(ll x,int pre){    if(x > INF)        return;    a[len ++] = x;    if(pre == 2)    {        dfs(x * 2, 2);        dfs(x * 3,3);        dfs(x * 5,5);        dfs(x * 7,7);    }    else if(pre == 3)    {        dfs(x * 3,3);        dfs(x * 5,5);        dfs(x * 7,7);    }    else if(pre == 5)    {        dfs(x * 5,5);        dfs(x * 7,7);    }    else dfs(x * 7,7);}int main(){    len = 0;    dfs(1,2);    sort(a,a + len);//    for(int i = 0; i < len ; i ++)//        cout << i << " " << a[i] << endl;    ll n;    int Tcase;    scanf("%d",&Tcase);//    while( ~ scanf("%I64d",&n))     for(int ii = 1; ii <= Tcase; ii ++)    {        scanf("%I64d",&n);        int point = upper_bound(a,a + len,n) - a;        if(a[point - 1] == n)        {            cout << n << endl;            continue;        }        cout << a[point] << endl;    }    return 0;}


0 0