1. 程式人生 > 實用技巧 >POJ2635(數論+尤拉篩+大數除法)

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