| 
 | 
 
 
发表于 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;
 
 - }
 
  复制代码 |   
 
 
 
 |