题目地址:POJ 2635
先用素数筛把10^6万以内素数筛出来。然后把输入的那个大数转化成数组,并且每三位存成一个数,这样可以节约内存和时间,然后利用同余线性的原理,对那个小整数以内的所有素数枚举,然后判断是否整除,找到最小的能被整除的。
代码如下:
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
char s[200];
int num[40], prime[150000], tot, check[2100000], cnt;
void init()
{
tot=0;
int i, j;
memset(check,0,sizeof(check));
for(i=2; i<=2000000; i++) {
if(!check[i]) {
prime[tot++]=i;
}
for(j=0; j<tot; j++) {
if(i*prime[j]>=2000000) break;
check[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
//printf("%d\n",tot);
}
void chai()
{
int i, ans, len=strlen(s), j;
cnt=0;
for(i=len-1; i>=0; i-=3) {
ans=0;
for(j=i-2; j<=i; j++) {
if(j>=0) {
ans=ans*10+s[j]-'0';
}
}
num[cnt++]=ans;
}
}
bool Judge(int x)
{
int ans=0;
for(int i=cnt-1; i>=0; i--) {
ans=(ans*1000+num[i])%x;
}
return !ans;
}
int main()
{
int b, i, j, flag;
init();
while(scanf("%s%d",s,&b)!=EOF&&s[0]!='0') {
flag=0;
chai();
for(i=0; i<tot; i++) {
if(prime[i]>=b) break;
if(Judge(prime[i])) {
flag=1;
break;
}
}
if(!flag) puts("GOOD");
else
printf("BAD %d\n",prime[i]);
}
return 0;
}