POJ2635-The Embarrassed Cryptographer-大整数素因子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ2635-The Embarrassed Cryptographer-大整数素因子相关的知识,希望对你有一定的参考价值。

计算一个大整数(10^100)中有没有一个小于L的素因子。这个大整数是两个素数的乘积。其实就是RSA加密。

做法是把大整数表示成千进位,用数组存储,然后一位一位地取模。

/*--------------------------------------------------------------------------------------*/
//        Helica‘s header 
//        Second Editions
//        2015.11.7
//
#include <algorithm>
#include <iostream>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>

//debug function for a N*M array 
#define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
{for(int j=0;j<(M);j++){printf("%d",G[i][j]);}printf("\n");}                
//debug function for int,float,double,etc.
#define debug_var(X) cout<<#X"="<<X<<endl;
/*--------------------------------------------------------------------------------------*/
using namespace std;

int N,M,T,L;
char save[110];
int num[110];

const int MAXN = 1000100;
int prime[MAXN];

void getPrime()
{
    memset(prime,0,sizeof prime);
    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 mod(int p,int len)
{
    int r = 0;
    for(int i=len-1;i>=0;i--)
        r = (r*1000 + num[i])%p;

    if(!r) return false;
    else return true;
}

int main()
{
    getPrime();

    while(scanf("%s%d",save,&L) && L)
    {
        int flag = 1;
        int len = strlen(save);

        memset(num,0,sizeof num);

        for(int i=0;i<len;i++)
        {
            int p = (len+2-i)/3-1;
            num[p] = num[p]*10+(save[i]-0);
        }
        len = (len+2)/3;

        for(int i=1;prime[i]<L;i++)
        {
            int p = prime[i];
            //printf("p=%d\n",p);
            if(!mod(p,len))
            {
                printf("BAD %d\n",p);
                flag = false;
                break;
            }
        }
        if(flag) printf("GOOD\n");
    }
}

 

以上是关于POJ2635-The Embarrassed Cryptographer-大整数素因子的主要内容,如果未能解决你的问题,请参考以下文章

[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)

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

POJ 2635 The Embarrassed Cryptographer(大数求余)

The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)

POJ 2115 C Looooops

POJ2115 C Looooops