POJ 2635 The Embarrassed Cryptographer
重要提示:不要在意那个图……
题目大意:
给一个K,范围0到10的100次方,是由两个素数相乘得出的。
再给出一个数L,范围0到10的6次方。
问相乘出K的两个素数是否都大于L,如果有小于的输出BAD+最小的那个素数,没有输出GOOD。
解题思路:
这其实是个模拟题啊……
1、先打出10的6次方加100以内的素数,为什么呢?防止越界。
2、将K处理成千进制,用同余模定理来从小到大枚举素数判断是否整除。
3、当枚举的素数大于L且没有能整除K的素数,输出GOOD,有就输出BAD+ 那个素数。
下面是代码:
#include <stdio.h> #include <string.h> #define N 1000500 int num[40],pri[N],prc=0; bool vis[N+5]= {false}; void ScreeningPrime() { int i, j; for(i = 2; i*i <= N; i++) { if(!vis[i]) { for(j = i*i; j <= N; j += i) { vis[j] = true; } } } for(i=2; i<N; i++) { if(!vis[i]) { pri[prc]=i; prc++; } } } bool mod(int pr,int len) { int yu=0; for(int i=len-1;i>=0;i--) { yu=(yu*1000+num[i])%pr; } if(yu) { return false; } else { return true; } } int main() { char k[105]; int l; ScreeningPrime(); while(scanf("%s%d",k,&l)!=EOF) { int len=strlen(k); if(l==0&&k[0]=='0'&&len==1) { break; } int cnt=0,flat=0,i=len-1,x=1; num[cnt]=0; while(i>=0) { num[cnt]+=(k[i]-'0')*x; x*=10; flat++; if(flat==3) { flat=0; x=1; cnt++; num[cnt]=0; } i--; } if(flat!=0) { cnt++; } flat=0; x=0; while(pri[x]<l) { if(mod(pri[x],cnt)) { flat=1; printf("BAD %d\n",pri[x]); break; } x++; } if(!flat) { puts("GOOD"); } } return 0; }