题目地址:POJ 2635
先用素数筛把10^6万以内素数筛出来。然后把输入的那个大数转化成数组,并且每三位存成一个数,这样可以节约内存和时间,然后利用同余线性的原理,对那个小整数以内的所有素数枚举,然后判断是否整除,找到最小的能被整除的。
代码如下:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using namespace std; #define LL __int64 #define pi acos(-1.0) const int mod=100000000; const int INF=0x3f3f3f3f; const double eqs=1e-8; char s[200]; int num[40], prime[150000], tot, check[2100000], cnt; void init() { tot=0; int i, j; memset(check,0,sizeof(check)); for(i=2; i<=2000000; i++) { if(!check[i]) { prime[tot++]=i; } for(j=0; j<tot; j++) { if(i*prime[j]>=2000000) break; check[i*prime[j]]=1; if(i%prime[j]==0) break; } } //printf("%d\n",tot); } void chai() { int i, ans, len=strlen(s), j; cnt=0; for(i=len-1; i>=0; i-=3) { ans=0; for(j=i-2; j<=i; j++) { if(j>=0) { ans=ans*10+s[j]-'0'; } } num[cnt++]=ans; } } bool Judge(int x) { int ans=0; for(int i=cnt-1; i>=0; i--) { ans=(ans*1000+num[i])%x; } return !ans; } int main() { int b, i, j, flag; init(); while(scanf("%s%d",s,&b)!=EOF&&s[0]!='0') { flag=0; chai(); for(i=0; i<tot; i++) { if(prime[i]>=b) break; if(Judge(prime[i])) { flag=1; break; } } if(!flag) puts("GOOD"); else printf("BAD %d\n",prime[i]); } return 0; }
POJ 2635 The Embarrassed Cryptographer (同余线性方程+素数筛)
原文地址:http://blog.csdn.net/scf0920/article/details/43030823