POJ2635(数论+欧拉筛+大数除法)

题目链接:https://vjudge.net/problem/POJ-2635

题意:给定一个由两个质数积的大数M和一个数L,问大数M的其中较小的质数是否小于L。

题解:因为大数M已经超过long long 范围,那么我们就需要进行大数分解由十进制转换为1000进制,然后只要从2-L遍历一遍。

代码详情:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<queue>
 7 using namespace std;
 8 #define mem(s,n) memset(s,n,sizeof s);
 9 typedef long long ll;
10 const int maxn=2e6+100;
11 const int Inf=0x7f7f7f7f;
12 bool isprime[maxn];
13 int prime[maxn];
14 int cnt;
15 // 欧拉筛打表素数表;
16 void judge()
17 {
18     mem(isprime,1);
19     cnt=0;
20     isprime[1]=0;
21     for(int i=2;i<maxn;i++)
22     {
23         if(isprime[i]==1)
24         prime[cnt++]=i;
25         for(int j=0;j<cnt&&(i*prime[j])<maxn;j++)
26         {
27             isprime[i*prime[j]]=0;
28             if(i%prime[j]==0)
29             {
30                 break;
31             }
32         }
33     }
34 }
35 int main()
36 {
37     char s[1005];
38     int n,k;
39     judge();
40     while(scanf("%s%d",s,&n)&&(s[0]!='0'&&n!=0))
41     {
42         int len=strlen(s);
43         for( k=2;k<n;k++)
44         {
45             if(isprime[k]==0) continue;
46             int num=0;
47             //大数分解;
48             for(int i=0;i<len;i+=3)
49             {
50                 int t=0,ks=1;
51                 for(int j=i;j<i+3&&j<len;j++) //转化为1000进制;
52                 {
53                     ks*=10;
54                     t=t*10+s[j]-'0';
55                 }
56                 num=num*ks+t;
57                 num%=k;
58             }
59             //关键;
60             if(num==0) 
61             {
62                 printf("BAD %d\n",k);
63                 break;
64             }
65         }
66         if(k==n) puts("GOOD");
67     }
68     return 0;
69 }
View Code

 

posted @ 2020-08-06 14:37  JamZF  阅读(119)  评论(0编辑  收藏  举报