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. 自学JQuery Mobile的几个例子

    JQuery Mobile是一个用于构建移动Web应用程序的框架,适用于主流的移动设备(智能手机.平板电脑),该框架利用了HTML5和CSS3技术减少了额外的脚本文件的编写.具体JQuery Mobi ...

  2. Ext.Net 使用总结之查询条件中的起始日期

    2.关于查询条件中起始日期的布局方式 首先上一张图,来展示一下我的查询条件的布局,如下: 大多数时候,我们的查询条件都是一个条件占一个格子,但也有不同的时候,如:查询条件是起始日期,则需要将这两个条件 ...

  3. 关于Connection must be valid and open.

    这个Bug真心很操蛋! 我的网站在公司做的运行一切都没问题,回家后咋自己的电脑上出现了Connection must be valid and open.这个问题. 我最后还是在英文网站的一个不起眼的 ...

  4. IOS自学笔记1——学前准备

    函数的声明和定义: 在标准的C编译器中,定义的函数只能调用前面已经定义的函数.若在main()函数里要调用其他方法,这时得首先在main()上面声明要调用的函数,即函数的声明. C语言中,函数的声明和 ...

  5. js中递归解析xml

    xml结构: <RightMenuItems>  <Item Code="New" Name="新建" GroupCode="Edi ...

  6. poj 2688 Cleaning Robot bfs+dfs

    题目链接 首先bfs, 求出两两之间的距离, 然后dfs就可以. #include <iostream> #include <cstdio> #include <algo ...

  7. [LeetCode]题解(python):142-Linked List Cycle II

    题目来源: https://leetcode.com/problems/linked-list-cycle-ii/ 题意分析: 给定一个链表,如果链表有环,返回环的起始位置,否则返回NULL.要求常量 ...

  8. 转: git常用命令

    # git配置 #---------------------------------------------- #配置用户名和邮箱: $ git config --global user.name & ...

  9. Qt信息隐藏(Q_D/Q_Q)介绍——从二进制兼容讲起

    http://www.cnblogs.com/SkylineSoft/articles/2046404.html

  10. 一个用C++写的Json解析与处理库

    什么是Json?这个库能做什么? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is e ...