poj2635(The Embarrassed Cryptographer)

题目地址:The Embarrassed Cryptographer

题目大意:

给定一个大数K,K是两个大素数的乘积的值。再给定一个int内的数L问这两个大素数中最小的一个是否小于L,如果小于则输出这个素数。

解题思路:

高精度求模+同余模定理

同余模定理:

例如要验证123是否被3整除,只需求模124%3

但当123是一个大数时,就不能直接求,只能通过同余模定理对大数“分块”间接求模

具体做法是:

先求1%3 = 1

再求(1*10+2)%3 = 0

再求 (0*10+4)% 3 = 1

那么就间接得到124%3=1,这是显然正确的

而且不难发现, (1*10+2)*10+4 = 124

这是在10进制下的做法,因为K很大,如果暴力从1枚举到L(L<=10^6),时间复杂度大约为10^8。

所以需要将K数组进行转化为千位进制的数组Kt ,时间复杂度大约是10^6。

千进制的性质与十进制相似。

例如,把K=1234567890转成千进制,就变成了:Kt=[  1][234][567][890]。

为了方便处理,我的程序是按“局部有序,全局倒序”模式存放Kt

即Kt=[890][567][234][1  ]  (一个中括号代表一个数组元素)

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

代码:

 1 #include <iostream>
 2 #include <cmath>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 using namespace std;
 8 const int M=1000100;
 9 int p[M],vis[M];
10 int prime()
11 {
12     int i,j;
13     int d=0;
14     memset(vis,1,sizeof(vis));
15     vis[0]=0;
16     vis[1]=0;
17     vis[2]=1;
18     for(i=2; i<=sqrt(M); i++)
19     {
20         if (vis[i])
21             for(j=i+i; j<=M; j+=i)
22             {
23                 vis[j]=0;
24             }
25     }
26     for(i=0; i<=M; i++)
27         if(vis[i])
28             p[d++]=i;
29 }
30 int main()
31 {
32     int l;
33     char k[105];
34     int kk[100];
35     prime();
36     while(scanf("%s%d",&k,&l)&&l)
37     {
38         int i,j;
39         int len=strlen(k);
40         int d=0,cnt=0,t,tt,ttt;
41         for(i=len-1; i>=0; d++)
42         {
43             t=k[i]-‘0‘;
44             t=t;
45             i--;
46             kk[d]=t;
47             if (i<0)
48                 break;
49             tt=k[i]-‘0‘;
50             tt=tt*10+t;
51             i--;
52             kk[d]=tt;
53             if (i<0)
54                 break;
55             ttt=k[i]-‘0‘;
56             ttt=ttt*100+tt;
57             i--;
58             kk[d]=ttt;
59             if (i<0)
60                 break;
61         }
62         int ce,flag=0;
63         while(p[cnt]<l)
64         {
65             for(ce=0,i=d; i>=0; i--)
66             {
67                 ce=(ce*1000+kk[i])%p[cnt];
68             }
69             if (ce==0)
70             {
71                 flag=1;
72                 break;
73             }
74             cnt++;
75         }
76         if (flag)
77             printf("BAD %d\n",p[cnt]);
78         else
79             printf("GOOD\n");
80         memset(k,0,sizeof(k));
81         memset(kk,0,sizeof(kk));
82     }
83     return 0;
84 }

时间: 2024-10-14 20:03:45

poj2635(The Embarrassed Cryptographer)的相关文章

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

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

HDOJ 题目2303 The Embarrassed Cryptographer(数学)

The Embarrassed Cryptographer Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 563    Accepted Submission(s): 172 Problem Description The young and very promising cryptographer Odd Even has impl

POJ 2635 The Embarrassed Cryptographer(高精度取模 + 同余模定理)

The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12905   Accepted: 3472 Description The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of

POJ 2635-The Embarrassed Cryptographer(高精度求模+同余模定理)

The Embarrassed Cryptographer Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2635 Appoint description:  System Crawler  (2015-05-28) Description The young and very promising cryptographer Odd E

Linux centos下让alias自定义永久生效(+常用的别名)

alias可以简化一些复杂的命令串,使一个单词或简化后的命令即可实现复杂(通常是带很多参数的长串)命令. 基本用法: alias 简化命令='实际的长串命令'    //实际长串命令通常为'原命令 -/选项参数' eg. alias ll='ls -a' 获取别名: alias        //即可查看当前设定的所有alias别名 取消别名: unalias 简化命令 eg. unalias ll            //取消ll的别名 永久生效: 直接使用alias命令定义的别名,重启后就

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

Tomcat配置远程调试端口(windows、Linux)

当我们需要定位生产环境问题,而日志又不清晰的情况下,我们可以借助Tomcat提供的远程调试,设置如下: // Linxu系统: apach/bin/startup.sh开始处中增加如下内容: declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8081" // Windows系统:

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [