#include <iostream>
#include <stdio.h>
#include <cstring>
#include <memory>
using namespace std;
int main()
{ char ss[110];
bool pa[1000010];
long long b;
int a[110],i,j,g,l,s,judge,k;
memset(pa,true,sizeof(pa));
pa[1]=false;
for (i=2;i<1000002;i++)
if (pa[i])
{
for (j=2*i;j<=1000002;j+=i) pa[j]=false;
}
scanf("%s",ss);
l=strlen(ss);
cin>>b;
while (ss[0]!='0'&&b!=0)
{
judge=0;
memset(a,0,sizeof(a));
g=l%3;k=1; //用1000进制存 正着存
if (g==2) a[k]=(ss[0]-'0')*10+(ss[1]-'0');
if (g==1) a[k]=(ss[0]-'0');
if (g!=0) k++;
for (i=0;i<=l/3-1;i++)
{
a[k]=(ss[3*i+g]-'0')*100+(ss[3*i+1+g]-'0')*10+(ss[3*i+2+g]-'0');k++;
}
l=k-1;
for (j=1;j<b;j++)
if (pa[j]==1&&judge==0)
{ int aa[k+5];
for (i=1;i<=l;i++) aa[i]=a[i];
g=0; //1000进制mod j,g为余数
for (i=1;i<=l;i++)
{
s=g*1000+aa[i];
g=s%j;
}
if (g==0) {cout<<"BAD "<<j<<endl;judge=1;}
}
if (judge==0) cout<<"GOOD"<<endl;
scanf("%s",ss);
l=strlen(ss);
cin>>b;
}
return 0;
}
题目大意:给定一个大整数,这个数是两个素数的乘积,然后给定一个数L,如果这两个素数中有一个比L小,就输出BAD;不然输出GOOD
高精度求模+同余模定理