题目

源地址:

http://poj.org/problem?id=3307

理解

如果一个数可以通过其他数的各数字位相乘得到,则说这个数具有productivity property。要求求出第i个具有这种性质的数。我们考虑1~9这些数字,显然,我们只要考虑1,2,3,5,7这四个质因数,因为别的数都能通过他们来得到,于是可以得到代码。

代码

#include <iostream>
#include <cstdio>
#define MAX 80000
using namespace std;
__int64 s[MAX];
__int64 d2[MAX];
__int64 d3[MAX];
__int64 d5[MAX];
__int64 d7[MAX];

void init()
{
    int i;
    int pos2, pos3, pos5, pos7;
    __int64 a, b;
    s[1] = 1;
    pos2 = pos3 = pos5 = pos7 = 1;
    for (i = 1; i < MAX - 1; i++)
    {
        d2[i] = s[i] * 2;
        d3[i] = s[i] * 3;
        d5[i] = s[i] * 5;
        d7[i] = s[i] * 7;
        while (d2[pos2] <= s[i])pos2++;
        while (d3[pos3] <= s[i])pos3++;
        while (d5[pos5] <= s[i])pos5++;
        while (d7[pos7] <= s[i])pos7++;
        a = d2[pos2] < d3[pos3] ? d2[pos2] : d3[pos3];
        b = d5[pos5] < d7[pos7] ? d5[pos5] : d7[pos7];
        s[i + 1] = a < b ? a : b;
    }
}

int main(int argc, char const *argv[])
{
    int k, n;
    scanf("%d", &k);
    init();
    while (k--)
    {
        scanf("%d", &n);
        printf("%I64d\n", s[n]);
    }
    return 0;
}

更新日志

  • 2014年07月18日 已AC。