http://poj.org/problem?id=2635
题意 :给你一个大数,它是两个素数的乘积,再给你一个数L,如果这两个素数中较小的那个比L小,就输出BAD和这个小的素数,反之就输出GOOD 。
思路 :所谓的高精度取模+同余模定理,表示真的不会。。。看的题解,才知道原来还可以是1000进制,很多人用了10000进制不对,原因是因为余数可能会超范围,而10进制估计会超时吧。
http://blog.csdn.net/lyy289065406/article/details/6648530
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std ; const int maxn = 1100000 ; char ch[160] ; int prime[maxn] ; int k[10000] ; void table() { int cnt = 0 ; prime[cnt++] = 2 ; for(int i = 3 ; i < maxn ; i += 2) { bool flag = true ; for(int j = 0 ; prime[j]*prime[j] <= i ; j++) { if(!(i%prime[j])) { flag = false ; break ; } } if(flag) prime[cnt++] = i ; } } bool getmod(const int *k,const int p,const int len) { int gcd = 0 ; for(int i = len-1 ; i >= 0 ; i--) gcd = (gcd*1000+k[i])%p ; if(!gcd) return false ; return true ; } int main() { table() ; int l ; while(scanf("%s %d",ch,&l)&&l) { int len = strlen(ch) ; memset(k,0,sizeof(k)) ; for(int i = 0 ; i < len ; i++) { int m = (len+2-i)/3-1 ; k[m] = k[m]*10+(ch[i]-'0') ; } int len1 = (len+2)/3 ; bool flag = true ; for(int i = 0 ; prime[i] < l ; i++) { if(!getmod(k,prime[i],len1)) { flag = false ; printf("BAD %d\n",prime[i]) ; break ; } } if(flag) printf("GOOD\n") ; } return 0 ; }