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;
}