1. 程式人生 > >POJ - 2635 The Embarrassed Cryptographer(千進制+同余模)

POJ - 2635 The Embarrassed Cryptographer(千進制+同余模)

long cal memset int cstring con mat UNC als

http://poj.org/problem?id=2635

題意

給一個大數K,K一定為兩個素數的乘積。現給出一個L,若K的兩個因子有小於L的,就輸出BAD,並輸出較小的因子。否則輸出GOOD

分析

1.轉換進制

直接用十進制計算的話會TLE,因此轉成千進制。即K=1234567899變成K=[998][765][432][1],註意以二進制類推,左邊為最低位,3位一組。

2.求素數

由於L最大為1e6,因此素數必須有大於1e6的,這裏用篩法。

3.求解答案

利用同余模定理,123%3=((1*10+2)*10+3)%3。由於我們變成了千進制,那麽10就變成1000就好,最後余數為0就說明能整除。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define
repx(i,x,e) for(int i=(x);i<=(e);i++) #define X first #define Y second #define PB push_back #define MP make_pair #define mset(var,val) memset(var,val,sizeof(var)) #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define
pd(a) printf("%d\n",a) #define scl(a) scanf("%lld",&a) #define scll(a,b) scanf("%lld%lld",&a,&b) #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c) #define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std; typedef long long ll; template <class T> void test(T a){cout<<a<<endl;} template <class T,class T2> void test(T a,T2 b){cout<<a<<" "<<b<<endl;} template <class T,class T2,class T3> void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;} const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3fll; const ll mod = 1e9+7; int T; void testcase(){ printf("Case %d: ",++T); } const int MAXN = 1e6+10; const int MAXM = 30; int prime[MAXN+1]; char K[MAXN]; int KT[MAXN]; int L; void getPrime(){ mset(prime,0); for(int i=2;i<=MAXN;i++){ if(!prime[i]) prime[++prime[0]]=i; for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){ prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } } bool func(int len,int p){ int res=0; for(int i=len-1;i>=0;i--){ res=(res*1000+KT[i])%p; } if(res) return false; return true; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL getPrime(); while(~scanf("%s%d",K,&L)&&L){ int lenk=strlen(K); mset(KT,0); for(int i=0;i<lenk;i++){ int tmp = (lenk+2-i)/3-1; KT[tmp]=KT[tmp]*10+(K[i]-0); } int Len = (lenk+2)/3; bool f=true; int pMin=1; while(prime[pMin]<L){ if(func(Len,prime[pMin])){ f=false; printf("BAD %d\n",prime[pMin]); break; } pMin++; } if(f) puts("GOOD"); } return 0; }

POJ - 2635 The Embarrassed Cryptographer(千進制+同余模)