poj 2635
大素数的问题,小心大数相乘时越界~~~~
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #include <list> 9 #include <ctime> 10 #include <set> 11 #include <cstring> 12 #include <queue> 13 #include <cstdio> 14 typedef long long ll; 15 #define CLR(arr, what) memset(arr, what, sizeof(arr)) 16 const int MAX = 1000000; 17 const int pmax = 1000001; 18 using namespace std; 19 const int nmax = 20; 20 int num[nmax]; 21 bool p[pmax]; 22 int pri[pmax]; 23 int prict; 24 int n; 25 void priList() { // 打素数表的模板 26 int i, j; 27 prict = 0; 28 memset(p, true, sizeof(p)); 29 for (i = 2; i * i < pmax; i++) 30 if (p[i]) { 31 for (j = i << 1; j < pmax; j += i) 32 p[j] = false; 33 } 34 for (prict = 0, i = 2; i < pmax; i++) 35 if (p[i]) 36 pri[prict++] = i; 37 } 38 39 int test(ll factor) { 40 ll curnum = 0; 41 ll nummax=MAX; 42 ll nextnum; 43 for (int i = 0; i < n; i++) { 44 ll nextnum=num[n - 1 - i]; 45 curnum = curnum * MAX + nextnum; 46 curnum = curnum % factor; 47 } 48 if (curnum) 49 return 0; 50 return 1; 51 } 52 53 54 int check(string t, int d) { 55 int sz = t.size(); 56 int tmp = t[0] - '0'; 57 if (t.size() == 1 && tmp == 0 && d == 0) { 58 return 1; 59 } 60 return 0; 61 } 62 63 void print_res(bool ok,int pos){ 64 if (ok) { 65 printf("BAD %d\n", pri[pos]); 66 } else { 67 printf("GOOD\n"); 68 } 69 } 70 int main() { 71 priList(); 72 string t; 73 int d, sz; 74 while (cin >> t >> d) { 75 sz = t.size(); 76 n = 0; 77 if (check(t, d)) { 78 return 0; 79 } 80 reverse(t.begin(), t.end()); 81 for (int i = 0; i < sz;) { 82 int cur = 0; 83 int pow = 1; 84 for (int j = 0; j < 6 && (i + j) < sz; j++) { 85 int curnum = (t[i + j] - '0'); 86 cur = cur + curnum * pow; 87 pow *= 10; 88 } 89 num[n++] = cur; 90 i = i + 6; 91 } 92 bool ok = false; 93 int i; 94 for (i = 0; i < prict; i++) { 95 if (pri[i] >= d) { 96 break; 97 } else { 98 ok = test(pri[i]); 99 } 100 if (ok) 101 break; 102 } 103 print_res(ok,i); 104 } 105 return 0; 106 }