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 }