一道高精度取模的简单题,有几个要注意的地方:
1.不要用10进制存数,会TLE
2.如果用10000进制或以上的存数,注意用long long,否则因为除数<=10^6,可能在秋末的时候超int导致WA
我用的1000进制,代码如下。
#include <cstdio>
#include <cstring>
int l,n,r,st,lim;
int num[105];
char str[105];
int prime[80000],cnt;
bool flag;
void calprime()
{
prime[0]=2; cnt=1;
for (int i=3;i<=1000100;i++)
{
flag=1;
for (int j=0;prime[j]*prime[j]<=i;j++)
{
if (i%prime[j]==0)
{
flag=0;
break;
}
}
if (flag) prime[cnt++]=i;
}
}
int mod(int *num,int n,int p)
{
int res=0;
for (int i=0;i<n;i++)
res=(res*1000+num[i])%p;
return res;
}
int main()
{
calprime();
while (scanf("%s%d",str,&lim)==2 && (str[0]!='0' || lim!=0))
{
l=strlen(str);
memset(num,0,sizeof(num));
st=(l-1)%3+1;
for (int i=0;i<st;i++) num[0]=num[0]*10+str[i]-'0';
r=0; n=1;
for (int i=st;i<l;i++)
{
num[n]=num[n]*10+str[i]-'0';
if (++r==3) {r=0; n++;}
}
flag=1;
for (int i=0;prime[i]<lim;i++)
{
if (mod(num,n,prime[i])==0)
{
flag=0;
printf("BAD %d\n",prime[i]);
break;
}
}
if (flag) puts("GOOD");
}
return 0;
}