POJ 2635 The Embarrassed Cryptographer

来源:互联网 发布:电信网络转换 编辑:程序博客网 时间:2024/04/29 19:28

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


题目大意:
给一个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 1000500int 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;}


0 0