1 条题解
-
0
该问题需要找到满足特定条件的素数对,使得:
- 在所有满足条件的素数对中,的值最大
代码实现主要分为以下几个步骤:
-
素数筛选: • 使用埃拉托斯特尼筛法(Sieve of Eratosthenes)预处理以内的所有素数,存储在数组中。
• 时间复杂度:,其中。
-
枚举素数对: • 遍历所有素数对,其中(保证)。
• 对于每个素数,从开始向后枚举素数,直到或。
• 记录满足条件的素数对中的最大值。
-
优化枚举范围: • 外层循环的枚举范围限制在以内,因为时才能满足。
• 内层循环在满足和的条件下提前终止。
关键点说明
-
素数筛选: • 预处理素数表,避免每次查询重复计算。
• 素数表的大小足够覆盖的情况(因为)。
-
条件判断: • 将分数比较转化为整数乘法,避免浮点数精度问题。
• 优先枚举较小的素数,并确保以维持。
-
提前终止: • 内层循环在或时立即终止,减少不必要的计算。
代码实现
#include "iostream" #include "cmath" using namespace std; int main() { char a[50001]={0}; unsigned short b[5135]; int i,j; i=1; while(1) { while(a[++i]!=0); if(i>sqrt(50000.0)) break; j=i; while(1) { j+=i; if(j>50000) break; a[j]=1; } } int t=0; for(int k=2;k<=50000;k++) { if(a[k]==0) { b[t++]=k; } } t--; while(1) { int m,aa,bb,tmparea; cin>>m>>aa>>bb; if(!m&&!aa&&!bb) return 0; int p=0,q=0,area=0; int len=(int)sqrt(100000.0)+1; for(int ii=0;b[ii]<=len;ii++) { for(int jj=ii;jj<=t;jj++) { tmparea=b[ii]*b[jj]; if(tmparea<=m&&aa*b[jj]<=bb*b[ii]) { if(tmparea>area) { p=b[ii]; q=b[jj]; area=tmparea; } } else { break; } } } cout<<p<<" "<<q<<endl; } return 0; }
- 1
信息
- ID
- 412
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者