POJ 2635 The Embarrassed Cryptographer

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

题意 :给你一个大数,它是两个素数的乘积,再给你一个数L,如果这两个素数中较小的那个比L小,就输出BAD和这个小的素数,反之就输出GOOD 。

思路 :所谓的高精度取模+同余模定理,表示真的不会。。。看的题解,才知道原来还可以是1000进制,很多人用了10000进制不对,原因是因为余数可能会超范围,而10进制估计会超时吧。

http://blog.csdn.net/lyy289065406/article/details/6648530

#include <iostream>

#include <stdio.h>

#include <string.h>

#include <math.h>



using namespace std ;

const int maxn = 1100000 ;

char ch[160] ;

int prime[maxn] ;

int k[10000] ;



void table()

{

    int cnt = 0 ;

    prime[cnt++] = 2 ;

    for(int i = 3 ; i < maxn ; i += 2)

    {

        bool flag = true ;

        for(int j = 0 ; prime[j]*prime[j] <= i ; j++)

        {

            if(!(i%prime[j]))

            {

                flag = false ;

                break ;

            }

        }

        if(flag)

            prime[cnt++] = i ;

    }

}

bool getmod(const int *k,const int p,const int len)

{

    int gcd = 0 ;

    for(int i = len-1 ; i >= 0 ; i--)

        gcd = (gcd*1000+k[i])%p ;

    if(!gcd)

        return false  ;

    return true ;

}

int main()

{

    table() ;

    int l ;

    while(scanf("%s %d",ch,&l)&&l)

    {

           int len = strlen(ch) ;

           memset(k,0,sizeof(k)) ;

           for(int i = 0 ; i < len ; i++)

           {

                int m = (len+2-i)/3-1 ;

                k[m] = k[m]*10+(ch[i]-'0') ;

           }

           int len1 = (len+2)/3 ;

           bool flag = true ;

           for(int i = 0 ; prime[i] < l ; i++)

           {

               if(!getmod(k,prime[i],len1))

               {

                   flag = false ;

                   printf("BAD %d\n",prime[i]) ;

                   break ;

               }



           }

           if(flag)

           printf("GOOD\n") ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(Graph)