打个1-1000000的素数表,然后利用同余模定理判断。判断是后用十进制会TLE,我用的1000000进制,尽量减少取模次数。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int nMax=1000005;
int tag[nMax],p[100000],L,cnt,dit;
long long a[100];
char s[105];
void get_prime()
{
cnt = 0; tag[1] = 1;
for (int i = 2; i<nMax; i++)
{
if(!tag[i]) p[cnt++]=i;
for(int j = 0;j<cnt&&p[j]*i<nMax;j++)
{
tag[i*p[j]] = 1;
if (i % p[j] == 0)
break;
}
}
}
void tran(int len)
{
int sum=0,c=0; dit=0;
for(int i=len-1;i>=-1;i--)
{
if(c && (c%6==0 || i==-1))
{
a[dit++]=sum; sum=0;
}
sum+=(s[i]-'0')*pow(10,(c%6)*1.0);
c++;
}
}
int ok(int M)
{
long long res=0;
for(int i=dit-1;i>=0;i--)
res=(res*1000000+a[i])%M;
if(res==0) return 1;
else return 0;
}
int main()
{
// freopen("test.txt","r",stdin);
get_prime();
while(scanf("%s%d",s,&L) && L)
{
int ans=-1,len=strlen(s);
tran(len);
for(int i=0;i<cnt;i++)
{
if(p[i]>=L) break;
if(ok(p[i]))
{
ans=p[i];break;
}
}
if(ans!=-1) printf("BAD %d\n",ans);
else printf("GOOD\n");
}
return 0;
}