Input
Output
For each number K, if one of its factors are strictly less than the required L, your program should output "BAD p", where p is the smallest factor in K. Otherwise, it should output "GOOD". Cases should be separated by a line-break.
0 0
BAD 31
不错的题!!!当时想的时候不知道怎么打这么长的素数表,看了小YOU的感觉自己素数打表都这么弱啊!!
题意就是一个由两个素数乘得大数,求其中最小的那个素数是否小于给出的数(记住是小于,不能等于,但愿被坑的人变少)。
用了高进制避免超时!!
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define M 1000050 using namespace std; int prime[M]; int tt; void isp()//这个打表算涨姿势了!!!! { tt=0; int i,j; prime[tt++]=2; for(i=3;i<M;i+=2) { int flag=1; for(j=0;prime[j]*prime[j]<=i;j++) { if(i%prime[j]==0) { flag=0; break; } } if(flag) prime[tt++]=i; } return ; } char s[205]; int kk[10005]; int wss; void conv()//转型 { int i,j; int l=strlen(s); memset(kk,0,sizeof kk); int flag=0; int bj=0; int cx=l%3; for(i=0,j=0;i<l;i++) { kk[j]=kk[j]*10+s[i]-'0'; flag++; if(bj==0&&flag==cx) { bj=1;j++;flag=0; } if(flag==3) {j++;flag=0;} } wss=j-1; return; } int main() { int n; int i,j; isp(); while(~scanf("%s%d",s,&n)&&s[0]!=0&&n!=0) { int an,ans; conv(); int flag=0; for(i=0;i<tt;i++) { if(prime[i]>=n) break; an=0; for(j=0;j<=wss;j++) { an=(an*1000+kk[j])%prime[i];//同余定理 } if(an==0) {flag=1;ans=prime[i];break;} } if(flag) printf("BAD %d\n",ans); else printf("GOOD\n"); } return 0; }
POJ 2635 The Embarrassed Cryptographer
原文地址:http://blog.csdn.net/hanhai768/article/details/38010721