POJ 2635 The Embarrassed Cryptographer
解题思路:
枚举10^6内的所有素数
诡异的是,采用10^10进制的时间比采用10^3进制时间大,不明真相
程序中采用的是10^12进制

#include <iostream>
using namespace std;
#define MAXL 1000001
#define MAXN 1e12
#define MAXP 78498
int prime[MAXP];
bool a[MAXL],find;
int main()
{
int m,p,i,j,l;
char ck[102];
long long t,f,cn[20];
memset(a,0x01,sizeof(a));
for(i=2;i<1001;i++)
if(a[i])for(j=i;i*j<MAXL;j++)a[i*j]=false;
for (p=0,i=2;i<MAXL;i++)if(a[i])prime[p++]=i;
while(scanf("%s %d",ck,&l)&&l)
{
m=strlen(ck);
for(i=(m%12)?m%12:12,f=1;i>0;i--)f*=10;
for(i=0;i<m;cn[i/12]=t,i+=12)
for(t=j=0;j<12&&i+j<m;j++)t=t*10+ck[i+j]-'0';
m=i/12;if(m==1&&cn[0]<l)l=cn[0];
for(find=i=0;i<p&&prime[i]<l&&!find;i++)
{
for(t=j=0;j<m;t=(t+cn[j])%prime[i],j++)
t=(j==m-1)?(t*f):(t*MAXN);
if(t==0)find=true;
}
if(find)printf("BAD %d\n", prime[i-1]);
else printf("GOOD\n");
}
return 0;
}