POJ 2635 The Embarrassed Cryptographer

重要提示:不要在意那个图……


题目大意:
给一个K,范围0到10的100次方,是由两个素数相乘得出的。

再给出一个数L,范围0到10的6次方。

问相乘出K的两个素数是否都大于L,如果有小于的输出BAD+最小的那个素数,没有输出GOOD。


解题思路:

这其实是个模拟题啊……

1、先打出10的6次方加100以内的素数,为什么呢?防止越界。

2、将K处理成千进制,用同余模定理来从小到大枚举素数判断是否整除。

3、当枚举的素数大于L且没有能整除K的素数,输出GOOD,有就输出BAD+ 那个素数。



下面是代码:

#include <stdio.h>
#include <string.h>

#define N 1000500
int num[40],pri[N],prc=0;
bool vis[N+5]= {false};
void ScreeningPrime()
{
    int i, j;
    for(i = 2; i*i <= N; i++)
    {
        if(!vis[i])
        {
            for(j = i*i; j <= N; j += i)
            {
               vis[j] = true;
            }
        }
    }
    for(i=2; i<N; i++)
    {
        if(!vis[i])
        {
            pri[prc]=i;
            prc++;
        }
    }
}
bool mod(int pr,int len)
{
    int yu=0;
    for(int i=len-1;i>=0;i--)
    {
        yu=(yu*1000+num[i])%pr;
    }
    if(yu)
    {
        return false;
    }
    else
    {
        return true;
    }
}
int main()
{
    char k[105];
    int l;
    ScreeningPrime();
    while(scanf("%s%d",k,&l)!=EOF)
    {
        int len=strlen(k);
        if(l==0&&k[0]=='0'&&len==1)
        {
            break;
        }
        int cnt=0,flat=0,i=len-1,x=1;
        num[cnt]=0;
        while(i>=0)
        {
            num[cnt]+=(k[i]-'0')*x;
            x*=10;
            flat++;
            if(flat==3)
            {
                flat=0;
                x=1;
                cnt++;
                num[cnt]=0;
            }
            i--;
        }
        if(flat!=0)
        {
            cnt++;
        }
        flat=0;
        x=0;
        while(pri[x]<l)
        {
            if(mod(pri[x],cnt))
            {
                flat=1;
                printf("BAD %d\n",pri[x]);
                break;
            }
            x++;
        }
        if(!flat)
        {
            puts("GOOD");
        }
    }
    return 0;
}


posted @ 2013-12-27 20:48  、小呆  阅读(121)  评论(0编辑  收藏  举报