题目大意:给定一个大整数,这个数是两个素数的乘积,然后给定一个数L,如果这两个素数中有一个比L小,就输出BAD;不然输出GOOD
高精度求模+同余模定理:
高精度求模,一边加一边模,不过如果是100或者1000进制这些,要注意啦,如1000进制 12345 应该为12 345这样,不要弄程123 45。我就是这样错的哦!!!
同余模定理:
http://hi.baidu.com/koomo007/blog/item/110cd6f58bc91964ddc47424.html额,WA了很多次哈,先是没有想到以10进制做要TLE,后来用1000有搞错了!!!
总结:各种方法算法要吃透才行啊。不能只领略大概。计算好时间空间复杂度!
WA 3次,1次AC 954MS
#include<stdio.h>
#include<string.h>
#include<math.h>
char ch[155];
int prime[500005],b[1010000],a[155];
int n,tot,m;
int get_mod(int p)
{
int i,ans;
ans=0;
for (i=1; i<=m ; i++ )
ans=(ans*1000+a[i])%p;
return ans;
}
int main()
{
int i,j,k,t,len;
memset(b,0,sizeof(b));
i=2;
tot=0;
while (1)
{
while (b[i]) i++;
prime[++tot]=i;
j=i;
if (i>1000000)
break;
while (j<=1010000)
{
b[j]=1;
j+=i;
}
}
while (scanf("%s%d",&ch,&n)==2&&n)
{
m=strlen(ch);
i=0;
k=0;
t=m%3;
if (t>0)
{
a[++k]=0;
for (i=0; i<t ; i++ )
a[k]=a[k]*10+ch[i]-48;
}
while (i<m)
{
t=3<m-i?3:m-i;
a[++k]=0;
for (j=i; j<i+t ; j++ )
{
a[k]=a[k]*10+ch[j]-48;
}
i+=t;
}
m=k;
i=1;
while (i<=tot&&prime[i]<n&&get_mod(prime[i]))
i++;
if (prime[i]<n)
printf("BAD %d\n",prime[i]);
else
printf("GOOD\n");
}
return 0;
}