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
",prime[i]) ;
                   break ;
               }

           }
           if(flag)
           printf("GOOD
") ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3438281.html