【题意】:给出一个数k(4<=k<=10100)和L(L<=106),问k的最小质因数是否小于L。

【题解】:显然我们只关心质因数,所以先对L求出它的所有质因数。
               然后就是判断这些质因数是否能够整除k,如果用十进制高精度去求模会TLE。
               考虑到进制越大,运算的次数就越少。因此我们可以更高的进制。
               我测试了两种进制,1000进制时800+MS,10000000000进制时500+MS。

【代码】:
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "algorithm"
 5 #include "vector"
 6 #include "queue"
 7 #include "cmath"
 8 #include "string"
 9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define mp make_pair
15 #define fi first
16 #define se second
17 #define lc(x) (x << 1)
18 #define rc(x) (x << 1 | 1)
19 #define lowbit(x) (x & (-x))
20 #define ll long long
21 #define maxn 110
22 #define maxl 1000050
23 char s[maxn];
24 int l, cnt;
25 int prime[100000], pn;
26 ll val[maxn];
27 
28 void getprime() {
29     bool isprime[maxl];
30     memset(isprime, truesizeof(isprime));
31     pn = 0;
32     for(ll i = 2; i < maxl; i++) {
33         if(isprime[i]) {
34             prime[pn++] = i;
35             for(ll j = i * i; j < maxl; j += i) isprime[j] = false;
36         }
37     }
38 }
39 
40 void work() {
41     int len = strlen(s);
42     ll res = 0;
43     cnt = 0;
44     for(int i = 0; i < len % 10; i++) {
45         res *= 10;
46         res += s[i] - '0';
47     }
48     val[cnt++] = res;
49     for(int i = len % 10; i < len; i += 10) {
50         res = 0;
51         for(int j = i; j < i + 10; j++) {
52             res *= 10;
53             res += s[j] - '0';
54         }
55         val[cnt++] = res;
56     }
57 }
58 
59 int main() {
60     getprime();
61     while(~scanf("%s%d", s, &l)) {
62         if(s[0] == '0' && l == 0) break;
63         work();
64         bool flag = true;
65         int len = (strlen(s) + 9) / 10;
66         for(int i = 0; i < pn && prime[i] < l; i++) {
67             ll res = 0;
68             for(int j = 0; j < cnt; j++) {
69                 res = res * 10000000000LL + val[j];
70                 res %= prime[i];
71             }
72             if(res == 0) {
73                 printf("BAD %d\n", prime[i]);
74                 flag = false;
75                 break;
76             }
77         }
78         if(flag) printf("GOOD\n");
79     }
80     return 0;
81 }
82