首页 > 代码库 > hdu2302(枚举,大数取模)

hdu2302(枚举,大数取模)

题目链接: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\n", prime[i]);
49                     break;
50                 }
51             }
52             if(flag){
53                 continue;
54             }
55             printf("GOOD\n");
56         }
57     }
58     return 0;
59 }

 

hdu2302(枚举,大数取模)