poj 2417
Accepted 8508K 391MS C++ 2004B
相比下边,,优化太多太多了。。。
/**
baby-step-giant-step 因为数据量太大,,自己写hash **/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
long long n,a,b;
const int maxn = ;
bool Hash[maxn];
long long idx[maxn];
long long val[maxn]; void ex_gcd(long long a,long long b,long long &x,long long &y){
if(b==){
x=;
y=;
return ;
}
ex_gcd(b,a%b,x,y);
long long tmp = x-(a/b)*y;
x = y;
y = tmp;
} long long euler(long long n){
long long i,tmp = n;
for(i=;i*i<=n;i++)if(n%i==){
tmp = tmp/i*(i-);
while(n%i==)
n = n/i;
}
if(n>)
tmp = tmp/n*(n-);
return tmp;
} void Insert(long long id,long long num){
long long k = num%maxn;
while(Hash[k]&&val[k]!=num){
k++;
if(k==maxn) k = k-maxn;
}
if(!Hash[k]){
Hash[k] =;
idx[k] = id;
val[k] = num;
}
} long long found(long long num){
long long k = num%maxn;
while(Hash[k]&&val[k]!=num){
k++;
if(k==maxn) k = k-maxn;
}
if(!Hash[k]){
return -;
}
return idx[k];
} long long baby_step(long long a,long long b,long long n){
long long m = ceil(sqrt(euler(n)+0.5));
memset(Hash,false,sizeof(Hash));
memset(idx,-,sizeof(idx));
memset(val,-,sizeof(val));
long long d=;
for(long long i=;i<m;i++){
Insert(i,d);
d = d*a%n;
}
long long res =;
long long x,y;
for(long long i=;i<m;i++){
ex_gcd(res,n,x,y);
long long tmp = x*b%n;
tmp = (tmp%n+n)%n;
long long k = found(tmp);
if(k!=-){
return (i)*m+k;
}
res = res*d%n;
}
return -;
} int main()
{
while(scanf("%I64d%I64d%I64d",&n,&a,&b)==){
long long res = baby_step(a,b,n);
if(res==-)
printf("no solution\n");
else
printf("%I64d\n",res);
}
return ;
} -----------------------------------分割线---------------------------------------
/**
106 高次方程。。。baby-step-giant-step 算法
Accepted 4592K4 516MS C++1104B
**/
#include <iostream>
#include <cstdio>
#include <math.h>
#include <map>
using namespace std; long long powmod(long long a,long long b,long long n){
if(b==)
return ;
long long c =;
while(b){
if(b&)
c =c*a%n;
a =a*a%n;
b>>=;
}
return c;
} long long logmod(long long a,long long b,long long n){
long long m,v,e=,i;
m = ceil(sqrt(n+0.5));
//cout<<(double)(n-1)*1.0/m<<endl;
//long long m_n = powmod(a,m,n);
v = powmod(a,n--m,n);
map<long long ,long long >x;
x.clear();
x[] =m;
for(i=;i<m;i++){
e = e*a%n;
if(!x[e]) x[e]=i;
}
for(i=;i<m;i++){
if(x[b]){
long long num = x[b];
x.clear();
return i*m+(m==num?:num);
}
b = b*v%n;
}
return -;
} int main()
{
long long a,b,n;
while(scanf("%I64d%I64d%I64d",&n,&a,&b)==){
long long res = logmod(a,b,n);
if(res==-)
printf("no solution\n");
else
printf("%I64d\n",res);
}
return ;
}
poj 2417的更多相关文章
- BSGS算法+逆元 POJ 2417 Discrete Logging
POJ 2417 Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4860 Accept ...
- POJ - 2417 Discrete Logging(Baby-Step Giant-Step)
d. 式子B^L=N(mod P),给出B.N.P,求最小的L. s.下面解法是设的im-j,而不是im+j. 设im+j的话,貌似要求逆元什么鬼 c. /* POJ 2417,3243 baby s ...
- POJ 2417 Discrete Logging 离散对数
链接:http://poj.org/problem?id=2417 题意: 思路:求离散对数,Baby Step Giant Step算法基本应用. 下面转载自:AekdyCoin [普通Baby S ...
- poj 2417 Discrete Logging(A^x=B(mod c),普通baby_step)
http://poj.org/problem?id=2417 A^x = B(mod C),已知A,B.C.求x. 这里C是素数,能够用普通的baby_step. 在寻找最小的x的过程中,将x设为i* ...
- POJ 2417 Discrete Logging BSGS
http://poj.org/problem?id=2417 BSGS 大步小步法( baby step giant step ) sqrt( p )的复杂度求出 ( a^x ) % p = b % ...
- 【POJ 2417】 Discrete Logging
[题目链接] http://poj.org/problem?id=2417 [算法] Baby-Step,Giant-Step算法 [代码] #include <algorithm> #i ...
- POJ 2417 Discrete Logging(离散对数-小步大步算法)
Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 ...
- POJ 2417 Discrete Logging
http://www.cnblogs.com/jianglangcaijin/archive/2013/04/26/3045795.html 给p,a,b求a^n==b%p #include<a ...
- poj 2417 && poj3243(Baby-Step Giant-Step)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4624 Accepted: 2113 ...
随机推荐
- Review1-11
泛型 泛型类 Public 类名 class<T>{} 泛型方法 Public static <T> 返回类型 方法名(<T> t){} 泛型类型必须使用引用类型 ...
- Class constructor
// example: class constructor #include <iostream> using namespace std; class Rectangle { in ...
- ECSHOP 模版文件里的编辑区域
Ecshop 中的模板能够有可编辑区域,在模板中是通过 <!-- TemplateBeginEditable name="左边区域" --> <!-- Templ ...
- ASP.NET页面上传文件时提示文件大小超过请求解决方法
在webconfig中节点 <system.web> </system.web> 下加入以下代码:maxRequestLength为限制上传文件大小,executionTime ...
- C#实现按Word模板导出Word(加书签bookMark)
本方法是针对word导出操作,需要制作好的模板文件 模板.doc 引入应用Microsoft.Office.Interop.Word 11.0 (office2003) 导出文件注意:有时候迅雷会在 ...
- 字典 -- 数据结构与算法的javascript描述 第七章
字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ...
- SQL学习之HAVING过滤分组
1.SQL除了能用Group By分组数据之外,SQL还允许过滤分组,规定包括那些分组,排除那些分组.例如,你可能想要列出至少有两个订单的所有顾客.为此,必须基于完整的分组而不是个别的行进行过滤. 基 ...
- WPF使用Log4net.dll库的demo(转载加个人观点)
原文地址:http://blog.csdn.net/linraise/article/details/50547149 配置文件解析地址:http://blog.csdn.net/pfe_nova/a ...
- Collections之sort的两个方法(自然排序和自定义比较器排序)
Collections是个服务于Collection的工具类(静态的),它里面定义了一些集合可以用到的方法. 本文演示了Collections类里sort()的两个方法.第一种只需传入被排序的集合,便 ...
- Android Log工具类
import java.text.SimpleDateFormat; import java.util.Date; import android.util.Log; public class LogU ...