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的更多相关文章

  1. BSGS算法+逆元 POJ 2417 Discrete Logging

    POJ 2417 Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4860   Accept ...

  2. 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 ...

  3. POJ 2417 Discrete Logging 离散对数

    链接:http://poj.org/problem?id=2417 题意: 思路:求离散对数,Baby Step Giant Step算法基本应用. 下面转载自:AekdyCoin [普通Baby S ...

  4. 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* ...

  5. POJ 2417 Discrete Logging BSGS

    http://poj.org/problem?id=2417 BSGS 大步小步法( baby step giant step ) sqrt( p )的复杂度求出 ( a^x ) % p = b % ...

  6. 【POJ 2417】 Discrete Logging

    [题目链接] http://poj.org/problem?id=2417 [算法] Baby-Step,Giant-Step算法 [代码] #include <algorithm> #i ...

  7. POJ 2417 Discrete Logging(离散对数-小步大步算法)

    Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 ...

  8. POJ 2417 Discrete Logging

    http://www.cnblogs.com/jianglangcaijin/archive/2013/04/26/3045795.html 给p,a,b求a^n==b%p #include<a ...

  9. poj 2417 && poj3243(Baby-Step Giant-Step)

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4624   Accepted: 2113 ...

随机推荐

  1. JavaScript之获取和设置元素属性

    1.与我前面的随笔获取元素的那些方法不同http://www.cnblogs.com/GreenLeaves/p/5689075.html 获取元素属性的方法getAttribute()不属于docu ...

  2. js 数字

    var text = $("#iptNum").val(); if(isNaN(text)){ alert("不是数字"); } else{ alert(&qu ...

  3. HOJ1087

    Self Numbers My Tags   (Edit)   Source : ACM ICPC Mid-Central USA 1998   Time limit : 5 sec   Memory ...

  4. ubuntu, Debian, CentOS

    ubuntu源自debian,内核很多文档都还是debian的字样,稳定性逐渐增强,基本满足日常开发. debian的核心稳定,性能强劲. centos的内核版本低,安全性高. 选择Debian是因为 ...

  5. python 实现单链表

    #! /usr/bin/env python ### ### Linked List python implementation ### ### @reference Data Structures ...

  6. Struts学习之自定义拦截器

    * 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类    * 要重写init().intercept().destroy()方法        * in ...

  7. Streams Studio配置Build options

    Defining build options You can change the build options of the internal builder for building an SPL ...

  8. Mysql笔记之 -- replace()实现mysql 替换字符串

    mysql 替换函数replace()实现mysql 替换字符串 mysql 替换字符串的实现方法:  mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数 ...

  9. jQuery入门第三

    jQuery入门第三 1.HTML 2.CSS 衣服 3.javascript 可以动的人 4.DOM 编程 对html文档的节点操作 5.jQuery 对 javascript的封装 简练的语法 复 ...

  10. IOS 特定于设备的开发:使用加速能力“向上定位”

    iPhone提供了3个机载的传感器,用于沿着iPhone的3根相互垂直的轴(左/右(x轴).上/下(y轴)和前/后(z轴))度量加速能力.这些值指示作用于iPhone的力,它们来自重力和用户移动.可以 ...