鱼C论坛

 找回密码
 立即注册
查看: 2988|回复: 5

题目87:考察能写成质数的2次,3次和4次方之和的数

[复制链接]
发表于 2016-8-10 17:49:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Prime power triples

The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is 28. In fact, there are exactly four numbers below fifty that can be expressed in such a way:

QQ20160810-1@2x.png


How many numbers below fifty million can be expressed as the sum of a prime square, prime cube, and prime fourth power?


题目:

最小的能写成质数的 2,3,4 次方之和的数是 28。50 以下一共有 4 个数可以写成这种形式:

QQ20160810-1@2x.png


5000 万以下的数中有多少个能写成一个质数的 2 次方,一个质数的 3 次方和一个质数的 4 次方之和?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-17 15:17:04 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-17 15:21 编辑

1097343
[Finished in 0.7s]
  1. def getPrimes(n):
  2.         primes = [True]*n
  3.         primes[0], primes[1] = False, False
  4.         for (i,prime) in enumerate(primes):
  5.                 if prime:
  6.                         for j in range(i*i,n,i):
  7.                                 primes[j] = False
  8.         primelist = []
  9.         for (k,trueprime) in enumerate(primes):
  10.                 if trueprime:
  11.                         primelist.append(k)
  12.         return primelist
  13. primelist = getPrimes(7100)

  14. xlist = getPrimes(90)
  15. ylist = getPrimes(380)
  16. count = []
  17. for x in xlist:
  18.         if x**4 >= 50000000:
  19.                 break
  20.         for y in ylist:
  21.                 if x**4 + y**3 >= 50000000:
  22.                         break
  23.                 for z in primelist:
  24.                         n = x**4 + y**3 + z**2
  25.                         if n >= 50000000:
  26.                                 break
  27.                         else:
  28.                                 count.append(n)
  29. print len(set(count))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-28 16:32:25 | 显示全部楼层
  1. # encoding:utf-8
  2. # 立方体表面最短路径
  3. from time import time
  4. def getPrimes(n):
  5.         primes = [True] * n
  6.         primes[0], primes[1] = False, False
  7.         for (i, prime) in enumerate(primes):
  8.             if prime:
  9.                 for j in range(i * i, n, i):
  10.                     primes[j] = False
  11.         return [k for (k, v) in enumerate(primes) if v]
  12. def euler087(N=10000):
  13.     NN = 50000000
  14.     l_primes = getPrimes(N)
  15.     s_result = set()
  16.     l2 = [x ** 2 for x in l_primes if x <= NN ** (1 / 2)]
  17.     l3 = [x ** 3 for x in l_primes if x <= NN ** (1 / 3)]
  18.     l4 = [x ** 4 for x in l_primes if x <= NN ** (1 / 4)]
  19.     for i in l2:
  20.         for j in l3:
  21.             for k in l4:
  22.                 if i + j + k < NN:
  23.                     # print(i,j,k)
  24.                     s_result.add(i + j + k)
  25.                 else:
  26.                     break
  27.     print(len(s_result))
  28. if __name__ == '__main__':
  29.     start = time()
  30.     euler087()
  31.     print('cost %.6f sec' % (time() - start))
复制代码

1097343
cost 0.688068 sec
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-22 00:30:53 | 显示全部楼层
  1. from time import process_time as t
  2. t1=t()
  3. def makeprimelist(end):
  4.   primelist=[True]*(end+1)
  5.   primelist[0],primelist[1]=None,False
  6.   for i,prime in enumerate(primelist[:int(end/2)]):
  7.     if prime:
  8.       for j in range(2*i,end+1,i):primelist[j]=False
  9.   return [i for i,prime in enumerate(primelist) if prime]
  10. aset=set()
  11. for power4 in makeprimelist(84):
  12.   for power3 in makeprimelist(368):
  13.     for power in makeprimelist(7071):
  14.       num=power**2+power3**3+power4**4
  15.       if num>50000000:break
  16.       aset.add(num)
  17. print('运行结果:{}\n运行时间:{}s'.format(len(aset),t()-t1))
复制代码
运行结果:1097343
运行时间:10.5s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-21 09:28:04 | 显示全部楼层
1097343
欧拉筛+三重循环+集合去重
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <set>
  4. #include <cmath>
  5. using namespace std;

  6. const int M = 10000;
  7. const int UB = 5e7;

  8. bool prime[M + 5];
  9. int factor[M];
  10. int kount = 0;

  11. void euler_sieve()
  12. {
  13.     prime[1] = false;
  14.    
  15.     for (int i = 2; i <= M; i++)
  16.         prime[i] = true;

  17.     for (int i = 2; i <= M; i++)
  18.     {
  19.         if (prime[i])
  20.             factor[++kount] = i;
  21.         for (int j = 1; j <= kount && i * factor[j] <= M; j++)
  22.         {
  23.             prime[i * factor[j]] = false;
  24.             if (i % factor[j] == 0)
  25.                 break;
  26.         }
  27.     }
  28. }

  29. int main(int argc, char const *argv[])
  30. {
  31.     //freopen("i.in", "r", stdin);
  32.     euler_sieve();
  33.     set<int> sumset;

  34.     for (int i = 1; i <= kount; i++){
  35.         int sq = factor[i]*factor[i];
  36.         if (sq >= UB)   break;
  37.         for (int j = 1; j <= kount; j++){
  38.             int cube = factor[j]*factor[j]*factor[j];
  39.             if (sq + cube >= UB)    break;
  40.             for (int k = 1; k <= kount; k++){
  41.                 int pw4 = factor[k]*factor[k]*factor[k]*factor[k];
  42.                 if (sq + cube + pw4 < UB)   sumset.insert(sq + cube + pw4);
  43.                 else    break;
  44.             }
  45.         }
  46.     }
  47.     int ans = sumset.size();
  48.     cout << ans << endl;
  49.     return 0;
  50. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-15 19:24:31 | 显示全部楼层
  1. /*
  2. 答案:1097343
  3. 耗时:0.572562秒
  4. */
  5. #include <iostream>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <vector>
  9. using namespace std;

  10. const int N = 50000000;
  11. char cp[N];
  12. vector<int> v2, v3, v4, v34;

  13. int main(void)
  14. {
  15.   memset(cp + 2, 1, (N - 2) * sizeof(char));
  16.   for (int i = 2; i <= (int)sqrt((double)N); ++i)
  17.   {
  18.     if (cp[i] == 0)
  19.       continue;
  20.     for (int j = i * i; j < N; j += i)
  21.       cp[j] = 0;
  22.   }
  23.   for (int i = 2; i <= (int)sqrt((double)N); ++i)
  24.   {
  25.     if (cp[i] == 0)
  26.       continue;
  27.     long long j = i;
  28.     j *= i;
  29.     if (j >= N)
  30.       break;
  31.     else
  32.     {
  33.       v2.push_back(j);
  34.       j *= i;
  35.       if (j < N)
  36.       {
  37.         v3.push_back(j);
  38.         j *= i;
  39.         if (j < N)
  40.           v4.push_back(j);
  41.       }
  42.     }
  43.   }
  44.   for (int i = 0; i < (int)v3.size(); ++i)
  45.   {
  46.     for (int j = 0; j < (int)v4.size(); ++j)
  47.     {
  48.       if (v3[i] + v4[j] >= N)
  49.         break;
  50.       v34.push_back(v3[i] + v4[j]);
  51.     }
  52.   }
  53.   v3.clear();
  54.   sort(v34.begin(), v34.end());
  55.   auto itr = unique(v34.begin(), v34.end());
  56.   int n = int(itr - v34.begin());
  57.   v34.resize(n);
  58.   for (int i = 0; i < (int)v2.size(); ++i)
  59.   {
  60.     for (int j = 0; j < (int)v34.size(); ++j)
  61.     {
  62.       if (v2[i] + v34[j] >= N)
  63.         break;
  64.       v3.push_back(v2[i] + v34[j]);
  65.     }
  66.   }
  67.   sort(v3.begin(), v3.end());
  68.   itr = unique(v3.begin(), v3.end());
  69.   int nCount = 0;
  70.   for (int i = 28; i < N; ++i)
  71.   {
  72.     if (binary_search(v3.begin(), itr, i))
  73.       ++nCount;
  74.   }
  75.   cout << nCount << endl;
  76.   return 0;
  77. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-11 16:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表