[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 11978 | Accepted: 3194 |
Description

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
set is terminated by a case where K = 0 and L = 0.
Output
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 (同余定理,素数打表)的更多相关文章
- POJ 2635 The Embarrassed Cryptographer (千进制,素数筛,同余定理)
The Embarrassed Cryptographer Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15767 A ...
- POJ 2635 The Embarrassed Cryptographer
大数取MOD... The Embarrassed Cryptographer Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1 ...
- POJ 2635 The Embarrassed Cryptographer(大数求余)
题意:给出一个大数,这个大数由两个素数相乘得到,让我们判断是否其中一个素数比L要小,如果两个都小,输出较小的那个. 分析:大数求余的方法:针对题目中的样例,143 11,我们可以这样算,1 % 11 ...
- poj 2635 The Embarrassed Cryptographer(数论)
题目:http://poj.org/problem?id=2635 高精度求模 同余模定理. 题意: 给定一个大数K,K是两个大素数的乘积的值.再给定一个int内的数L 问这两个大素数中最小的一个是 ...
- POJ 2635 The Embarrassed Cryptographer 大数模
题目: http://poj.org/problem?id=2635 利用同余模定理大数拆分取模,但是耗时,需要转化为高进制,这样位数少,循环少,这里转化为1000进制的,如果转化为10000进制,需 ...
- POJ 2635 The Embarrassed Cryptographer 高精度
题目地址: http://poj.org/problem?id=2635 题意:给出一个n和L,一直n一定可以分解成两个素数相乘. 让你判断,如果这两个素数都大于等于L,则输出GOOD,否则输出最小的 ...
- POJ - 2635 The Embarrassed Cryptographer(千进制+同余模)
http://poj.org/problem?id=2635 题意 给一个大数K,K一定为两个素数的乘积.现给出一个L,若K的两个因子有小于L的,就输出BAD,并输出较小的因子.否则输出GOOD 分析 ...
- POJ 1465 Multiple (BFS,同余定理)
id=1465">http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS Memory Limit: 32768K T ...
- POJ 1595 Prime Cuts (ZOJ 1312) 素数打表
ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=312 POJ:http://poj.org/problem?id=159 ...
随机推荐
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)
功能说明 该步骤实现的功能包括: 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面. 2. 通过ApplicatoinContext的getBean()方法获得容器里面 ...
- 用python模拟登录(解析cookie + 解析html + 表单提交 + 验证码识别 + excel读写 + 发送邮件)
老婆大人每个月都要上一个网站上去查数据,然后做报表. 为了减轻老婆大人的工作压力,所以我决定做个小程序,减轻我老婆的工作量. 准备工作 1.tesseract-ocr 这个工具用来识别验证码,非常好用 ...
- 多线程+socket实现多人聊天室
最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo: demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消 ...
- 洛谷 P3384 【模板】树链剖分
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...
- [转载] ConcurrentHashMap原理分析
转载自http://blog.csdn.net/liuzhengkang/article/details/2916620 集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的 ...
- K-Means和图片压缩
通俗的介绍这种压缩方式,就是将原来很多的颜色用少量的颜色去表示,这样就可以减小图片大小了.下面首先我先介绍下K-Means,当你了解了K-Means那么你也很容易的可以去理解图片压缩了,最后附上图片压 ...
- java的String构造对象的几种方法以及内存运行过程
String类创建对象的方法可以分为以下三种 1.String a = "123"; 2.String b = new String("123"); 3.Str ...
- ORA-01843: 无效的月份
1.插入的日期如果是DateTime类型的,没有影响 2.如果DateTime.ToString()获取的日期,就会报错,例如(@param_datetime = cf.GetServerDateTi ...
- git学习之创建版本库
创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以 ...
- c语言的流程控制
1. 流程控制 ● 顺序结构:默认的流程结构.按照书写顺序执行每一条语句. ● 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码. ● 循环结构:在给定条件成立的情况下,反复执行某一 ...