X-man

导航

[USACO 1.5.3]特殊的质数肋骨

#include<stdio.h>
#include<string.h>
#include<math.h>
int m;
int a[4]={2,3,5,7};
int b[4]={1,3,7,9};
int c[10];
int number;
bool visit[101000];
int prime[100000];
int n=100000;
int init_prim()
{
    memset(visit,true,sizeof(visit));
    int num=0;
    for(int i=2;i<=n;i++)
    {
        if(visit[i]==true)
        {
            num++;
            prime[num]=i;
        }
        for(int j=1;(j<=num)&&(i*prime[j]<=n);j++)
        {
            visit[i*prime[j]]=false;
            if(i%prime[j]==0)break;
        }
    }
    return 0;
}

int num(int k)
{
    number = 0;
    for(int i=0;i<=k;i++)
    {
        number=number*10+c[i];
    }
    for(int i=2;i<sqrt(number+0.5);i++)
    if(number%prime[i]==0)return 0;
    return 1;
}
int pri(int k)
{
    if(k==m)
    {
        for(int i=0;i<m;i++)
        printf("%d",c[i]);
        printf("\n");
    }
    else if(k==0)
    {
        for(int i=0;i<4;i++)
        {
            c[k]=a[i];
            pri(k+1);
        }
    }
    else
    {
        for(int i=0;i<4;i++)
        {
            c[k]=b[i];
            if(!num(k))continue;
            pri(k+1);
        }
    }
    return 0;

}
int main()
{
    init_prim();
    while(scanf("%d",&m)!=EOF)
    {
        memset(c,0,sizeof(c));
        pri(0);
    }
    return 0;
}

http://www.acmore.net/problem.php?id=1075

posted on 2013-05-10 14:36  雨钝风轻  阅读(391)  评论(0编辑  收藏  举报