找到幸运与否的数字

Finding a number lucky or not

我正在尝试解决黑客等级超过 here 的问题。

问题是:

所以为了解决这个问题,我尝试了一个简单的数学方程式:

4x + 7y = lucky_number

例如,要检查 15 是否为 lucky_number,我可以从 xy0 开始并代入上面的等式直到它等于或大于(如果是这样停下来说它不是幸运数字)

以上逻辑运行良好。但问题是大数字,想象一下检查数字 966888032206353 幸运与否,从 x,y0 不是一个有效的想法。

有什么指导吗?

你的一个问题是你的问题描述很不完整。实际上,如果只允许负 xy,则可以将任何整数表示为 4x + 7y。例如,1 = 4*2 + (-1)*7,您可以通过乘以该因数得到任何数字的解。

我想从算法的角度来看,最好的解决方案是使用动态规划。您可以简单地开始检查数字是否在您看来是幸运的。一旦找到 4 个连续的幸运数字,就可以停下来,因为之后的任何数字只需将 4 加适当的次数即可幸运。我猜你会很早就找到一个由 4 个连续的幸运数字组成的序列。

另一种思考方式:您需要做的就是绘制直线

7y = -4x + 966888032206353

并找出 x 和 y 均为整数的任何点。

因此,您不需要嵌套循环。相反:

  1. 将 y 作为整数进行迭代。 for y=0; y<966888032206353 / 7; y++

  2. 对于每次迭代,使用浮点数学求解 x。

  3. 若x为整数,则为幸运数

这将需要大约 138T 次迭代。

所有7*4=28以上的数字(实际上是18以上的所有数字)都是幸运的,其余的只需预先计算一个小的table。

这是我提交给 Hackerrank 的代码。

#include <bits/stdc++.h>
using namespace std;
int q; long long n; bool dp[1009];
int main() {
    cin >> q;
    dp[0] = true;
    for(int i = 1; i <= 1000; i++) {
        if(i >= 4 && dp[i - 4]) dp[i] = true;
        if(i >= 7 && dp[i - 7]) dp[i] = true;
    }
    while(q--) {
        cin >> n;
        if(n >= 1000 || dp[n]) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

这是动态规划,但是如果n >= 28总是可以的。