重要提示:不要在意那个图……
题目大意:
给一个K,范围0到10的100次方,是由两个素数相乘得出的。
再给出一个数L,范围0到10的6次方。
问相乘出K的两个素数是否都大于L,如果有小于的输出BAD+最小的那个素数,没有输出GOOD。
解题思路:
这其实是个模拟题啊……
1、先打出10的6次方加100以内的素数,为什么呢?防止越界。
2、将K处理成千进制,用同余模定理来从小到大枚举素数判断是否整除。
3、当枚举的素数大于L且没有能整除K的素数,输出GOOD,有就输出BAD+ 那个素数。
下面是代码:
#include <stdio.h>
#include <string.h>
#define N 1000500
int num[40],pri[N],prc=0;
bool vis[N+5]= {false};
void ScreeningPrime()
{
int i, j;
for(i = 2; i*i <= N; i++)
{
if(!vis[i])
{
for(j = i*i; j <= N; j += i)
{
vis[j] = true;
}
}
}
for(i=2; i<N; i++)
{
if(!vis[i])
{
pri[prc]=i;
prc++;
}
}
}
bool mod(int pr,int len)
{
int yu=0;
for(int i=len-1;i>=0;i--)
{
yu=(yu*1000+num[i])%pr;
}
if(yu)
{
return false;
}
else
{
return true;
}
}
int main()
{
char k[105];
int l;
ScreeningPrime();
while(scanf("%s%d",k,&l)!=EOF)
{
int len=strlen(k);
if(l==0&&k[0]=='0'&&len==1)
{
break;
}
int cnt=0,flat=0,i=len-1,x=1;
num[cnt]=0;
while(i>=0)
{
num[cnt]+=(k[i]-'0')*x;
x*=10;
flat++;
if(flat==3)
{
flat=0;
x=1;
cnt++;
num[cnt]=0;
}
i--;
}
if(flat!=0)
{
cnt++;
}
flat=0;
x=0;
while(pri[x]<l)
{
if(mod(pri[x],cnt))
{
flat=1;
printf("BAD %d\n",pri[x]);
break;
}
x++;
}
if(!flat)
{
puts("GOOD");
}
}
return 0;
}