The Embarrassed Cryptographer
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 11978   Accepted: 3194

Description

The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of users, which is now in use in his company. The cryptographic keys are
created from the product of two primes, and are believed to be secure because there is no known method for factoring such a product effectively. 

What Odd Even did not think of, was that both factors in a key should be large, not just their product. It is now possible that some of the users of the system have weak keys. In a desperate attempt not to be fired, Odd Even secretly goes through all the users
keys, to check if they are strong enough. He uses his very poweful Atari, and is especially careful when checking his boss' key.

Input

The input consists of no more than 20 test cases. Each test case is a line with the integers 4 <= K <= 10100 and 2 <= L <= 106. K is the key itself, a product of two primes. L is the wanted minimum size of the factors in the key. The input
set is terminated by a case where K = 0 and L = 0.

Output

For each number K, if one of its factors are strictly less than the required L, your program should output "BAD p", where p is the smallest factor in K. Otherwise, it should output "GOOD". Cases should be separated by a line-break.

Sample Input

143 10
143 20
667 20
667 30
2573 30
2573 40
0 0

Sample Output

GOOD
BAD 11
GOOD
BAD 23
GOOD
BAD 31

Source

解题思路:

给定两个数。一个数S是由两个素数 a,b相乘得到的数。还有一个数L随便,问 min(a,b) 是否小于L。

解题思路:素数打表,然后从前往后遍历看S能否被当前素数整除。假设整除,推断是否小于L。

注意:给定的S是大数。仅仅能用字符数组保存。

一个数a推断能不能整除b,仅仅要推断 a%b是否等于0就能够了。

同余定理:

(a+b)%c=(a%c+b%c)%c;

(a*b)%c=(a%c+b%c)%c;

对大数取余

模板:  大数字符串形式 a[1000];

char a[1000];

int m=0;

for(int i=0;a[i]!='\0';i++)

m=((m*10)%n+(a[i]-'0')%n)%n;//也能够写成  m=(m*10+a[i]-'0')%n

m为所求的余数

本题大数求余的方法为: 把字符串从后面起 三位三位的保存在一个int类型数组中,比方 12345   存在int类型数组里面为  12   345  然后依照前面的方法求:

bool mod(int n)
{
int m=0;//气死我了!! ! !!! for(int i=0;i<=k-1;i++)
m=(m*1000+num[i])%n;
if(m==0)
return true;
return false;
}

做题时出了个BUG弄得头昏脑胀。半天后才发现原来int m=0; 一開始没有赋值为0.......哭死...

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=1000005;
bool isprime[maxn+1];
int prime[maxn+1];
int primelen=0;//素数表的长度
int slen;//输入大数的长度
char s[10000];int l;
int num[600];int k;//转换后的长度 void sieve(int n)//筛法求素数
{
for(int i=0;i<=n;i++)
isprime[i]=1;
isprime[0]=isprime[1]=0;
for(int i=2;i<=n;i++)
{
if(isprime[i])
{
prime[primelen++]=i;
for(int j=2*i;j<=n;j+=i)
isprime[j]=0;
}
}
} void change()//将字符串每三位(从后数)放在int数组中,比方 12345 , 12 345
{
k=0;
int a=slen/3;
int b=slen%3;
int temp=0;
if(b)//不能被3整除
{
for(int i=0;i<b;i++)
temp=temp*10+s[i]-'0';
num[k++]=temp;
}
int cnt=0;
for(int i=1;i<=a;i++)
{
temp=0;
int start=b+3*cnt;
for(int j=0;j<3;j++)
temp=temp*10+s[start+j]-'0';
num[k++]=temp;
cnt++;
}
} bool mod(int n)
{
int m=0;//气死我了。!。!!! for(int i=0;i<=k-1;i++)
m=(m*1000+num[i])%n;
if(m==0)
return true;
return false;
} int main()
{
sieve(maxn);
while(cin>>s>>l&&(s[0]!='0'||l!=0))
{
slen=strlen(s);
change();
bool ok=1;
int ans;
for(int i=0;i<primelen;i++)
{
if(mod(prime[i])&&prime[i]<l)
{
ok=0;
ans=prime[i];
break;
}
if(prime[i]>=l)
break;
}
if(ok)
cout<<"GOOD"<<endl;
else
cout<<"BAD "<<ans<<endl;
}
return 0;
}

[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)的更多相关文章

  1. POJ 2635 The Embarrassed Cryptographer (千进制,素数筛,同余定理)

    The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15767   A ...

  2. POJ 2635 The Embarrassed Cryptographer

    大数取MOD... The Embarrassed Cryptographer Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1 ...

  3. POJ 2635 The Embarrassed Cryptographer(大数求余)

    题意:给出一个大数,这个大数由两个素数相乘得到,让我们判断是否其中一个素数比L要小,如果两个都小,输出较小的那个. 分析:大数求余的方法:针对题目中的样例,143 11,我们可以这样算,1 % 11 ...

  4. poj 2635 The Embarrassed Cryptographer(数论)

    题目:http://poj.org/problem?id=2635 高精度求模  同余模定理. 题意: 给定一个大数K,K是两个大素数的乘积的值.再给定一个int内的数L 问这两个大素数中最小的一个是 ...

  5. POJ 2635 The Embarrassed Cryptographer 大数模

    题目: http://poj.org/problem?id=2635 利用同余模定理大数拆分取模,但是耗时,需要转化为高进制,这样位数少,循环少,这里转化为1000进制的,如果转化为10000进制,需 ...

  6. POJ 2635 The Embarrassed Cryptographer 高精度

    题目地址: http://poj.org/problem?id=2635 题意:给出一个n和L,一直n一定可以分解成两个素数相乘. 让你判断,如果这两个素数都大于等于L,则输出GOOD,否则输出最小的 ...

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

    http://poj.org/problem?id=2635 题意 给一个大数K,K一定为两个素数的乘积.现给出一个L,若K的两个因子有小于L的,就输出BAD,并输出较小的因子.否则输出GOOD 分析 ...

  8. POJ 1465 Multiple (BFS,同余定理)

    id=1465">http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K T ...

  9. POJ 1595 Prime Cuts (ZOJ 1312) 素数打表

    ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=312 POJ:http://poj.org/problem?id=159 ...

随机推荐

  1. sublime 集成git插件,及git常用命令

    以前用了很久的totoiseSVN,显然不够高大上,开发界的版本装x利器还得是git.然而git的命令行对没怎么用过linux的人可能觉得还不如用gitGUI,可是当你知道sublime可以集成git ...

  2. Java面试宝典

    相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消 ...

  3. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)

    一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...

  4. 人生苦短,python是岸.

    人生苦短,python是岸. 愿付一生,应许之诚.

  5. java的String构造对象的几种方法以及内存运行过程

    String类创建对象的方法可以分为以下三种 1.String a = "123"; 2.String b = new String("123"); 3.Str ...

  6. iOS获取所有机型

    1.手机系统版本:9.1 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSSt ...

  7. SSH框架的多表查询(方法二)增删查改

     必须声明本文章==>http://www.cnblogs.com/zhu520/p/7773133.html  一:在前一个方法(http://www.cnblogs.com/zhu520/p ...

  8. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  9. "MySql.Data.MySqIClient.MySqlProviderSevices”违反了继承安全 性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安 全可访问性低。 "解决方法

    写Code First 时(使用的是MySql数据库),添加好EntityFrame.MySql.Data .MySql.Data.Entity后 ,写好TestDbContext类. 运行时报出一个 ...

  10. PHP命令空间namespace及use的用法实践总结

    以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...