poj 2447 代码改正
2013-11-18 16:02
232 查看
//之前2447贴错了代码,表示很sorry
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define MAXN 10
#define Ct 16381
#define I64 long long
I64 multi(I64 a, I64 b, I64 n){
I64 tmp = a % n, s = 0;
while(b){
if(b & 1) s = (s + tmp) % n;
tmp = (tmp + tmp) % n;
b >>= 1;
}
return s;
}
I64 Pow(I64 a, I64 b, I64 n){
I64 tmp = a % n, s = 1;
while(b){
if(b & 1) s = multi(s, tmp, n);
tmp = multi(tmp, tmp, n);
b >>= 1;
}
return s;
}
I64 gcd(I64 a, I64 b){
return b ? gcd(b, a % b) : a;
}
I64 Ext_Gcd(I64 a, I64 b, I64 &x, I64 &y){
if(!b){
x = 1, y = 0;
return a;
}
I64 r = Ext_Gcd(b, a % b, x, y);
I64 t = x; x = y; y = t - a / b * y;
return r;
}
I64 pollard_rho(I64 n, I64 c){
I64 x, y, d, i = 1, k = 2;
srand((I64)time(0));
x = ((I64) rand()) % (n - 1) + 1;
y = x;
while(1){
i ++;
x = (multi(x, x, n) + c) % n;
d = gcd(y - x + n, n);
if(d != 1 && d != n) return d;
if(y == x) return n;
if(i == k) y = x, k <<= 1;
}
}
int main(){
I64 C, E, N, D, M, P, Q, T, X, Y;
while(~scanf("%I64d %I64d %I64d", &C, &E, &N)){
P = pollard_rho(N, Ct);
Q = N / P;
T = (P - 1) * (Q - 1);
Ext_Gcd(E, T, X, Y);
D = (X + T) % T;
M = Pow(C, D, N);
printf("%lld\n", M);
}
return 0;
}
相关文章推荐
- 6个常见的 PHP 安全性攻击
- JAVA 学习笔记一
- 解决PHP在IE浏览器下载文件,中文文件名乱码问题
- Java多线程的学习
- Java环境变量配置
- C#读写二进制文件
- lua 取一个数字的整数部分
- GoAgent,真乃神器也
- 关闭输入法及格式化VBA代码工具
- Yii 学习笔记 (Model篇)
- Asp.net DropDownList 自定义样式(想怎么改就怎么改!)
- 如何自动化地完成对您C/C++/Ada应用的测试?
- 类似hibernate的JDBC(java反射--dao层封转,减少代码书写)
- eclipse EclipseLink
- python进阶1--数据库支持
- Python的装饰器
- 代码中坏味道和对应重构方法——摘自《重构,改善既有代码的设计》
- Qt QtDBus compilation
- RHEL系统以FTP服务器搭建yum源
- java 常量池认识