RSA hdu 1211 数论的水题(数据较弱)
2013-10-15 19:31
344 查看
RSA
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1138 Accepted Submission(s): 836
[align=left]Problem Description[/align]
RSA is one of the most powerful methods to encrypt data. The RSA algorithm is described as follow:
> choose two large prime integer p, q
> calculate n = p × q, calculate F(n) = (p - 1) × (q - 1)
> choose an integer e(1 < e < F(n)), making gcd(e, F(n)) = 1, e will be the public key
> calculate d, making d × e mod F(n) = 1 mod F(n), and d will be the private key
You can encrypt data with this method :
C = E(m) = me mod n
When you want to decrypt data, use this method :
M = D(c) = cd mod n
Here, c is an integer ASCII value of a letter of cryptograph and m is an integer ASCII value of a letter of plain text.
Now given p, q, e and some cryptograph, your task is to "translate" the cryptograph into plain text.
[align=left]Input[/align]
Each case will begin with four integers p, q, e, l followed by a line of cryptograph. The integers p, q, e, l will be in the range of 32-bit integer. The cryptograph consists of l integers separated by blanks.
[align=left]Output[/align]
For each case, output the plain text in a single line. You may assume that the correct result of plain text are visual ASCII letters, you should output them as visualable letters with no blank between them.
[align=left]Sample Input[/align]
101 103 7 11
7716 7746 7497 126 8486 4708 7746 623 7298 7357 3239
[align=left]Sample Output[/align]
I-LOVE-ACM.
[align=left]Author[/align]
JGShining(极光炫影)
[align=left]Source[/align]
杭电ACM省赛集训队选拔赛之热身赛
[align=left]Recommend[/align]
Eddy
这个题目的真的是相当水,我本来一开始正在发愁又要解线性同余方程了,可是当我看到别人的博客此题数据极
弱,让我颇有点不太适应的,我顿时觉得还是poj的数论题目的比较刺激啊,唉,Romance
however, is rocky
this
month!!!!感情不顺,只好做数论题目让我开心点!!!
n=p*q, f(n)=(p-1)*(q-1), d*e%f(n)=1, m=c^d%n,我们竟然按照这个式子模拟就能过了!!!!
让我等屌丝惊呆了!!!!!!!!!!!!!!!
#include<iostream> #include<cstdio> using namespace std; int main() { int i,j,p,q,f,e,l,c,m,n,d; while(scanf("%d%d%d%d",&p,&q,&e,&l)!=EOF) { n=p*q; f=(p-1)*(q-1); d=1; while(d*e%f!=1) d++; for(i=0;i<l;i++) { scanf("%d",&c); int t=1; for(j=0;j<d;j++) { t=(t*c)%n; } printf("%c",t); } cout<<endl; } return 0; }
相关文章推荐
- 纠正从小的认识错误[关于闰年的判断]
- WRKRPYLE-自动回复询问类消息(Inquiry Message)
- puppet错误解决
- 财务分析与决策——资产的价值
- android文字后跟图片的实现方法
- jbpm与OA项目开发过程实录 (二)
- EditPlus正则表达式替换字符串
- C#多线程学习(六) 互斥对象
- 2013-10-14任务分配
- 完成端口(I/O completion)原理收藏
- 水一篇
- [转]linux内核网络分层结构
- C#多线程学习(四) 多线程的自动管理(线程池)
- 101 个 MySQL 的调节和优化的提示
- WCS表关联信息url
- 浅谈jfinal
- Unicore xuudb启动报错:java.security.InvalidKeyException: Illegal key size 解决方案
- Tomcat6.0虚拟目录配置
- abc类地址是如何划分的? (转)
- LeetCode:Permutations