给一个大数K和一个数L(L<=10^6),这个数是由两个素数相乘得到的。问这两个素数是否有一个严格小于L。
高精度求模,用10进制的会TLE,所以尽量把数往大进制转换。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAXN 2000010
using namespace std;
bool prime[MAXN];
void getPrime()
{
int i, j;
prime[0] = prime[1] = false;
for(i = 2; i < MAXN; i ++)
{
prime[i] = true;
}
for(i = 2; i * i < MAXN; i ++)
{
if(prime[i]) {
for(j = i * i; j < MAXN; j += i)
{
prime[j] = false;
}
}
}
}
int bign[260000];
int BigMod(char *str,int n)
{
int i,j,ls;
long long t;
ls=strlen(str);
i=ls%4;
t=0;
for (j=0; j<i; j++)
{
t*=10;
t+=str[j]-'0';
}
t%=n;
for (i=ls%4; i<ls; i+=4)
{
for (j=0; j<4; j++)
{
t*=10;
t+=(long long)(str[i+j]-'0');
}
t%=n;
}
return t;
}
int main()
{
int L,i,j;
char str[200];
getPrime();
while (1)
{
scanf("%s%d",str,&L);
if (strcmp(str,"0") == 0 && L == 0)
break;
for (i=2; i<L; i++)
{
if (prime[i])
{
if (BigMod(str,i) == 0)
break;
}
}
if (i == L)
printf("GOOD\n");
else
printf("BAD %d\n",i);
}
}