|
发表于 2021-7-4 10:06:56
|
显示全部楼层
本帖最后由 guosl 于 2022-1-14 09:53 编辑
本题其实与上题一样,只是选择的和项只能是素数而已。用递推就不太容易做了,但换成母函数却非常容易,只是在构造母函数时只选择素数来构造就行了。
- /*
- 答案:71
- 耗时:0.0001137秒
- */
- #include <iostream>
- #include <cstring>
- using namespace std;
- struct stPolynomial//母函数对应的多项式
- {
- int a[101];
- stPolynomial(void)
- {
- memset(a, 0, sizeof(a));
- }
- stPolynomial(int k)
- {
- memset(a, 0, sizeof(a));
- for (int i = 0; i*k <= 100; ++i)
- a[i*k] = 1;
- }
- stPolynomial(const stPolynomial &p)
- {
- memcpy(a, p.a, sizeof(a));
- }
- const stPolynomial& operator=(const stPolynomial &p)
- {
- memcpy(a, p.a, sizeof(a));
- return *this;
- }
- stPolynomial operator*(const stPolynomial &p) const
- {
- stPolynomial x;
- for (int i = 0; i <= 100; ++i)
- {
- for (int j = 0; j <= 100; ++j)
- {
- if (i + j <= 100)
- x.a[i + j] += a[i] * p.a[j];
- }
- }
- return x;
- }
- };
- int main(void)
- {
- char cp[100];//构建100以内的素数表
- memset(cp, 1, 100 * sizeof(char));
- cp[0] = 0;
- cp[1] = 0;
- for (int i = 2; i <= 10; ++i)
- {
- if (cp[i] == 0)
- continue;
- for (int j = i * i; j < 100; j += i)
- cp[j] = 0;
- }
- stPolynomial f(2);
- int k = 3;
- while (true)
- {
- stPolynomial g(k);
- f = f * g;//用所有小于k的素数进行组合
- if (f.a[k] > 5000)//检查组合数是否大于5000
- break;
- //选择下一个素数
- k += 2;
- while (cp[k] == 0)
- k += 2;
- }
- cout << k << endl;
- return 0;
- }
复制代码 |
|