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