【POJ 2635】 The Embarrassed Cryptographer
考查素数表就好好玩素数表……卡mod算啥= =TOT 总之 就是敲个表 暴力枚举取余 一发十进制取余(即*10+%TLE……) 看disscuss才知道mod多了影响很大 改成高进制取(既多累几位再取) 985ms
刚才强加了别人的打表代码 跳了1400ms.。。吓死宝宝了 看来学的这种打法挺实用 呱唧呱唧
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define sz 1000000
#define ll long long
bool IsPrim[sz+1];
int p[78500];
int tp;
void Init()
{
memset(IsPrim,0,sizeof(IsPrim));
tp = 0;
for(int i = 2; i <= sz; ++i)
{
if(!IsPrim[i]) p[tp++] = i;
for(int j = 0; j < tp && p[j]*i <= sz; ++j)
{
IsPrim[p[j]*i] = 1;
if(i%p[j]==0) break;
}
}
}
int main()
{
//freopen("../../../in.in","r",stdin);
Init();
char k[112];
int l,t,i,j;
unsigned ll ans;
while(~scanf("%s %d",k,&l) && l)
{
for(i = 0; i < tp && p[i] < l; ++i)
{
ans = 0;
for(j = 0; k[j];)
{
for(t = j;t-j <= 12 && k[t]; ++t)//测数据测出最多累积12位 longlong 最多11
ans = ans*10+(k[t]-'0');
ans %= p[i];
j = t;
}
if(!ans) break;
}
if(i == tp || p[i] >= l) puts("GOOD");
else printf("BAD %d\n",p[i]);
}
return 0;
}