首页 > 代码库 > HDU 2012 素数判定(素数)
HDU 2012 素数判定(素数)
HDU 2012 素数判定(素数)
http://acm.hdu.edu.cn/showproblem.php?pid=2012
题意:水题一枚
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
分析:
本题的数据范围很小,求出表达式在-39到50内的所有可能值可以得到下面的数:
1523 1447 13731301 1231 1163 1097 1033 971 911
853 797 743 691 641 593 547 503 461 421
383 347 313 281 251 223 197 173 151 131
113 97 83 71 61 53 47 43 41 41
43 47 53 61 71 83 97 113 131 151
173 197 223 251 281 313 347 383 421 461
503 547 593 641 691 743 797 853 911 971
1033 1097 11631231 1301 1373 1447 1523 1601 1681
1763 1847 19332021 2111 2203 2297 2393 2491 2591
最大的数为2591,所以我们只要求出3000范围内所有素数,然后每次求出表达式范围值,判断都是否素数即可。
当然本题更快的方法是预处理所有可能的数,看上面矩阵中哪些是素数,哪些不是素数,然后直接对于范围x,y输出结果。
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=3000; //生成素数表 bool flag[maxn+5];//flag[i]==true表i为素数 int prime[maxn+5]; int get_prime() { for(int i=2;i<=maxn;i++) { if(prime[i]==0) { flag[i]=true; prime[++prime[0]]=i; } for(int j=1;j<=prime[0] && prime[j]<=maxn/i;j++) { prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } return prime[0]; } //计算公式的值 int compute(int x) { return x*x+x+41; } //判断范围内是否都为素数 bool check(int a,int b) { for(int i=a;i<=b;i++) if(!flag[compute(i)]) return false; return true; } int main() { get_prime(); int a,b; while(scanf("%d%d",&a,&b)==2) { if(a==0&&b==0) break; printf("%s\n",check(a,b)?"OK":"Sorry"); } return 0; }
HDU 2012 素数判定(素数)