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. Android Afinal框架学习(二) FinalActivity 一个IOC框架

    框架地址:https://github.com/yangfuhai/afinal 相应的源代码: net.tsz.afinal.annotation.view.* FinalActivity Fina ...

  2. Linux系统CentOS6.2版本号下安装JDK7具体过程

    前言:        java 是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE( ...

  3. CSS定位深入理解 完全掌握CSS定位 相对定位和绝对定位

    其实前面的标准流和浮动流都很理解,就是定位不太好理解,特别是相对定位和绝对定位,很多刚开始学的同学不好区分.因此这里,小强老师和大家一起分享CSS定位的学习. 通过我们前面的学习,我们网页布局方法: ...

  4. SQL XML process

    declare @data xml set @data=' <bookstore> <book category="COOKING"> <title ...

  5. .Net Mvc4 Kendo Grid Demo

    看见人家项目中用到了Kendo Grid组件,感觉不错,于是就没有压制住自己内心的好奇心!嘿嘿,咱们开始吧,步骤很简单,理解起来也很容易. 首先我们创建一个空的ASP.NET MVC 4 Web 应用 ...

  6. 跟我一起学写jQuery插件开发方法(转载)

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧!     很 ...

  7. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  8. bzoj 2542: [Ctsc2001]终极情报网 费用流

    题目链接 2542: [Ctsc2001]终极情报网 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 321  Solved: 125[Submit][S ...

  9. JConsole是什么

    从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “ ...

  10. JAVA并发,后台线程

    package com.xt.thinks21_2; import java.util.concurrent.TimeUnit; /** * 后台线程测试 * * @author Administra ...