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. c++ 回调类成员函数实现

    实现类成员函数的回调,并非静态函数:区分之 #ifndef __CALLBACK_PROXY_H_ #define __CALLBACK_PROXY_H_ template <typename ...

  2. PLSQLDeveloper过期要注册表

    打开运行输入 regedit 打表注册表 删除 HKEY_CURRENT_USER\Software\Allround Automations HKEY_CURRENT_USER\Software\M ...

  3. PostMessage和SendMessage的区别

    1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数.而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息 ...

  4. sql存储过程的简单使用

    存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 创建 ...

  5. HTML之学习笔记(三)文本标签

    标题标签 html的标题标签从h1~h6共六个级别,权值不断降低,即不断变小,不用使用CSS控制来取代h标签,因为网页搜索引擎通过搜索到你的页面,找到你页面的h标签并为h标签建立索引,如果h标签被替代 ...

  6. HTML5新增加的功能

    1.部分代码代替了以前的代码     例如: 获取焦点     旧:document.getElementById("price");.focus;     新:<input ...

  7. Android应用如何开机自启动、自启动失败原因

    本文主要介绍Android应用如何开机自启动.自启动失败的原因.adb命令发送BOOT_COMPLETED.问题:应用程序是否可以在安装后自启动,没有ui的纯service应用如何启动?答案马上揭晓^ ...

  8. Java基础之静态变量

    public class StaticVariable { public static void main(String[] args) { Person p1 = new Person(); Per ...

  9. LaTeX空格

    由于LaTeX 采用的是源文件编译方式,  默认LaTeX会忽略多余的空格, 如果需要产生一个空格,可以使用 命令 \, 注意代表的是空间键. 例如: Jones, et al.\  (1993), ...

  10. Use API to retrieve data from internet

    Reference: Working with APIs Many big companies and organizations provide API for us to retrieve dat ...