POJ3006

来源:互联网 发布:域名icp备案查询 编辑:程序博客网 时间:2024/06/05 16:49

POJ3006 狄利克雷定理

狄利克雷定理:给定初始a与公差d,若a与d互素,则a,a+d,a+2d,a+3d,,,可以产生无限个素数。现在给定三个正数a,d,n,要求这个数列的第n个素数是多少?且知道所求的数小于1000000(一百万)。

输入:a<=9307,d<=346,n<=210

输出:求第n个素数

解:由所求的数小于1000000且给的测试数据中的d比较大,n比较小可以知道可以直接判断数列的每个数是不是素数就行。先用筛选法算出前1000000的所有素数,然后在从数列开始一一判断即可。注意1不是素数,标记的时候要小心。

代码:

#include<cstring>#include<cstdio>#include<cmath>usingnamespace std;const intmaxn=1000000;intvis[maxn];int  main(){    memset(vis,0,sizeof(vis));    vis[1]=1;    int m=(int)sqrt(maxn+0.5);    for(int i=2;i<=m;i++)if(!vis[i])    {        for(int j=i*i;j<=maxn;j+=i)        {            vis[j]=1;        }    }    int a,d,n;   while(scanf("%d%d%d",&a,&d,&n)==3&&a&&d&&n)    {        int cnt=0,p;        while(1)        {            if(!vis[a]&&++cnt==n)            {                printf("%d\n",a);                break;            }            a+=d;        }    }    return 0;}

0 0
原创粉丝点击