题目地址: http://poj.org/problem?id=2635
题意:给出一个n和L,一直n一定可以分解成两个素数相乘。
让你判断,如果这两个素数都大于等于L,则输出GOOD,否则输出最小的那个素数。
从1到1000000的素数求出来,然后一个一个枚举到L,看能否被n整除,能的话就输出BAD+改素数
都不行的话,说明两个素数都大于等于L,输出GOOD
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;
typedef long long LL;
const int N=1000005;
const LL II=100000000;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
LL pri[N/100];
bool num[N];
int xx;
char s[105];
LL x[100];
void prime()
{
LL i,j;
int k=0;
memset(num,0,sizeof(num));
for(i=2;i<N;i++)
{
if(!num[i])
{
pri[++k]=i;
for(j=i;j<N;j+=i)
num[j]=1;
}
}
xx=k;
}
void toint(char *s,LL *t,int &k)
{
int len=strlen(s),j;
char x[10]={0};
k=0;
for(;len/8;len-=8)
{
strncpy(x,s+len-8,8);
LL sum=0;
for(j=0;j<8;j++)
sum=sum*10+x[j]-'0';
t[k++]=sum;
}
if(len)
{
strncpy(x,s,len);
LL sum=0;
for(j=0;j<len;j++)
sum=sum*10+x[j]-'0';
t[k++]=sum;
}
}
bool modd(LL p,int len)
{
int i;
LL xh=0;
for(i=len-1;i>=0;i--)
xh=(xh*II+x[i])%p;
if(xh==0)
return true;
return false;
}
int main()
{
int i,j,L;
prime();
while(scanf("%s%d",s,&L))
{
if(strcmp(s,"0")==0&&L==0)
break;
int len;
toint(s,x,len);
int p=1,flag=0;
while(pri[p]<L)
{
if(modd(pri[p],len))
{
flag=1;
printf("BAD %lld\n",pri[p]);
break;
}
p++;
}
if(flag==0)
printf("GOOD\n");
}
return 0;
}