题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2303
题意:给出两个数k, l(4<= k <= 1e100, 2<=l<=1e6);其中k是两个素数的乘积,问k是否存在严格小于l的因子,若有,输出 BAD 该因子,反之输出GOOD;
思路:
先1e6内素数打表,再枚举一个因子,判断因子用大数取模;
代码:
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #define MAXN 105
5 #define INF 1000010
6 using namespace std;
7
8 int l, prime[INF], vis[INF];
9 char s[MAXN];
10
11 void get_prime(){
12 int k=0;
13 for(int i=2; i<INF; i++){
14 if(!vis[i]){
15 prime[k++]=i;
16 for(int j=2; i*j<INF; j++){
17 vis[i*j]=1;
18 }
19 }
20 }
21 }
22
23 //**大数取模,(a+b)%m=a%m+b%m, (a*b)%m=(a%m*b%m)%m;
24 int mod(int m){
25 int count=1, ans=0;
26 for(int i=strlen(s)-1; i>=0; i--){
27 int gg=(s[i]-'0')*count;
28 ans=(ans+gg)%m;
29 count=count*10%m;
30 }
31 if(ans==0){
32 return 1;
33 }else{
34 return 0;
35 }
36 }
37
38 int main(void){
39 get_prime();
40 while(scanf("%s%d", s, &l)){
41 if(s[0]=='0'&&l==0){
42 return 0;
43 }else{
44 int flag=0;
45 for(int i=0; prime[i]<l; i++){
46 flag=mod(prime[i]);
47 if(flag){
48 printf("BAD %d
", prime[i]);
49 break;
50 }
51 }
52 if(flag){
53 continue;
54 }
55 printf("GOOD
");
56 }
57 }
58 return 0;
59 }