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;
}

 

posted on 2010-12-31 15:04  ltang  阅读(198)  评论(0)    收藏  举报

导航