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 ...
随机推荐
- Cocos2D-x权威指南:核心类成员CCNode
节点类(CCNode)是Cocos2D-x中的主要类,继承自CCObject.继承关系如图3-2所看到的. 不论什么须要画在屏幕上的对象都是节点类. 最经常使用的节点类包含场景类(CCScene).布 ...
- Android Gson深入分析
眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的).Gson(Google官网出的).解析速度最快的是Gson,下载地址:htt ...
- [转]PB 基本语句 循环语句
PB 基本语句一.赋值语句赋值语句用于给变量.对象属性赋值,这是应用程序中使用最频繁的语句,其语法格式为:variablename = expression_r其中:⑴variablename是变量名 ...
- jQuery数据缓存data(name, value)详解及实现
一. jQuery数据缓存的作用 jQuery数据缓存的作用在中文API中是这样描述的:“用于在一个元素上存取数据而避免了循环引用的风险”.如何理解这句话呢,看看我下面的举例,不知道合不合适,如果你有 ...
- vc6.0批量编译
一直想研究一下怎么让电脑批处理编译程序,今天就从vc6开始,做个记录,学习一下. VC可以生成make文件(Project->Export Makefile),在设置好环境变量下,执行NMAKE ...
- Decorators and Wrappers in Python
python代码一贯以优雅,简洁著称,而有时侯反而会让人难以理解,比如说wrapper(或者说decorator),这种方式提高了代码的可重用性,使用起来更简洁方便. 举个例子,比如WebApp常用的 ...
- 使用 http://httpbin.org/ 验证代理地址
发现一个很方便的工具,在Linux 下使用 curl http://httpbin.org/ 可以返回当前使用的一些网络信息
- 搭建Ubuntu环境中的Error [dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题][安装Flashplayer出错 ]
//解决方法如下: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock sudo dpkg -r flashplugin-i ...
- MySQL 复制
第一步:为配置主数据库与备数据库 主:server_id = 1 log_bin = E:\mysql_log_bin #复制事实上是二进制文件在备库上的重做,所以要支持二进制文件. 备: ...
- RedHat升级内核成功
升级前 uname -aLinux localhost.localdomain 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x8 ...