http://210.33.19.103/problem/2183

参考:https://blog.csdn.net/frods/article/details/67639410(里面代码好像不太对)(不用求逆元的方法)

https://blog.csdn.net/zzkksunboy/article/details/73162229(要逆元的方法)

参考代码:https://blog.csdn.net/clove_unique/article/details/51227328

以下代码pojA不掉,没有unordered_map,map又T掉;要手写哈希表

https://www.luogu.org/problemnew/show/P3846

https://cn.vjudge.net/problem/POJ-3243

https://cn.vjudge.net/problem/POJ-2417

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<tr1/unordered_map>
using namespace std;
using namespace tr1;
typedef long long LL;
LL poww(LL a,LL b,LL md)
{
LL base=a,ans=;
for(;b;base=base*base%md,b>>=) if(b&) ans=ans*base%md;
return ans;
}
LL logm(LL a,LL b,LL md)
{
if(md==) return -;
if(a%md==) return b?-:(a==);
if(b==) return a?:-;
//printf("a%lld %lld %lld\n",a,b,md);
//以上为特判,记一下
LL g,num=,d=;
while((g=__gcd(a,md))!=)
{
if(b%g) return -;
num++;b/=g;md/=g;d=d*(a/g)%md;
if(b==d) return num;//特殊技巧,记一下;num==0的情况前面已经判了
//设gg为所有已经除过的g的积,原来b为B,此时的b实际相当于B/gg
//d=a^num/gg,如果a^num==B,则d==b
}
//printf("b%lld %lld %lld\n",a,b,md);
LL sz=sqrt(md+0.5),sz1=(md-)/sz+,i,now,t=poww(a,sz,md);//sz块大小,sz1块数
unordered_map<LL,LL> ma;
for(i=,now=b%md;i<sz;i++,now=now*a%md)//x=i*sz-j,因此j属于[0,sz-1]
{
ma[now]=i;//应该使得x最小,则j应越大越好,因此相同的保留最大的
//printf("c%lld %lld\n",i,now);
}
for(i=,now=d;i<=sz1;i++)//因此i属于[1,sz1]
{
now=now*t%md;
if(ma.count(now)) return i*sz-ma[now]+num;
//printf("d%lld\n",i);
}
return -;
}
LL a,md,b,ans;
int main()
{
while(){
scanf("%lld%lld%lld",&a,&md,&b);
if(a==&&md==&&b==) break;
ans=logm(a,b,md);
ans==-?puts("No Solution"):printf("%lld\n",ans);
}
return ;
}

压一下:

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<tr1/unordered_map>
using namespace std;
using namespace tr1;
typedef long long LL;
LL poww(LL a,LL b,LL md)
{
LL base=a,ans=;
for(;b;base=base*base%md,b>>=) if(b&) ans=ans*base%md;
return ans;
}
LL logm(LL a,LL b,LL md)
{
if(md==) return -;
if(a%md==) return b?-:(a==);
if(b==) return a?:-;
LL g,num=,d=;
while((g=__gcd(a,md))!=)
{
if(b%g) return -;
num++;b/=g;md/=g;d=d*(a/g)%md;
if(b==d) return num;
}
LL sz=sqrt(md+0.5),sz1=(md-)/sz+,i,now,t=poww(a,sz,md);
unordered_map<LL,LL> ma;
for(i=,now=b%md;i<sz;i++,now=now*a%md) ma[now]=i;
for(i=,now=d;i<=sz1;i++)
{
now=now*t%md;
if(ma.count(now)) return i*sz-ma[now]+num;
}
return -;
}
LL a,md,b,ans;
int main()
{
while(){
scanf("%lld%lld%lld",&a,&md,&b);
if(a==&&md==&&b==) break;
ans=logm(a,b,md);
ans==-?puts("No Solution"):printf("%lld\n",ans);
}
return ;
}

EXBSGS的更多相关文章

  1. BZOJ 3122 SDOI2013 随机数发生器 数论 EXBSGS

    标题效果:给定一列数X(i+1)=(a*Xi+b)%p 最低要求i>0.所以Xi=t 0.0 这个问题可以1A那很棒 首先讨论特殊情况 如果X1=t ans=1 如果a=0 ans=b==t? ...

  2. BZOJ2480Spoj3105 Mod&BZOJ1467Pku3243 clever Y——EXBSGS

    题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入     每个测试文件中最多包含100组测试数据.     每组数据中,每行包含3个正整数a,p,b.     当a=p ...

  3. BSGS与exBSGS学习笔记

    \(BSGS\)用于解决这样一类问题: 求解\(A^x ≡B(modP)\)的最小\(x\),其中\(P\)为质数. 这里我们采用分块的方法,把\(x\)分解为\(i *t-b\)(其中\(t\)是分 ...

  4. hdu 2815 Mod Tree (exBSGS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2815 //解 K^D ≡ N mod P #include<map> #include<cma ...

  5. exBSGS·BSGS-Senior/扩展的BSGS

    \(\rm{0x01\quad Preface}\) \(emmm\)严格来讲,不应该被算到一个模板里面.因为在我看来模板是人构造出来的,但是这个算法应该是一个解决问题的\(process\)-更像是 ...

  6. Luogu4195 【模板】exBSGS(exBSGS)

    如果a和p互质,用扩欧求逆元就可以直接套用普通BSGS.考虑怎么将其化至这种情况. 注意到当x>=logp时gcd(ax,p)是一个定值,因为这样的话每个存在于a中的质因子,其在ax中的出现次数 ...

  7. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  8. exBSGS学习笔记

    exBSGS学习笔记 Tags:数学 题目的话就做下洛谷的模板好了 // luogu-judger-enable-o2 #include<algorithm> #include<io ...

  9. 【模板】exBSGS/Spoj3105 Mod

    [模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...

  10. MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS

    思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj. ...

随机推荐

  1. 项目Beta冲刺(团队7/7)

    项目Beta冲刺(团队7/7) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标: 完成项目Beta版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 陈宇 ...

  2. c++学习笔记之基础---类内声明函数后在类外定义的一种方法

    在C++的“类”中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数体. } 这个是在类 ...

  3. linux centos7 安装常用软件java,node,mysql,Seafile

    linux centos7 安装常用软件java,node,mysql,Seafile 安装压缩解压缩软件 yum install -y unzip zip 安装git yum install -y ...

  4. MySQL 权限生效

    用GRANT.REVOKE或SET PASSWORD对授权表施行的修改会立即被服务器注意到. 如果你手工地修改授权表(使用INSERT.UPDATE等等),你应该执行一个FLUSH PRIVILEGE ...

  5. oracle中去掉文本中的换行符、回车符、制表符

    一.特殊符号ascii定义 制表符 chr(9)  换行符 chr(10) 回车符 chr(13) UPDATE tc_car_order set USE_REASON =  REPLACE('USE ...

  6. java map 装入list

    需要生成多组数据的时候,应将map时候放入循环,否则循环出来会一直覆盖之前的,只能保存一条数据. 具体如下: if (rs.next()) { do { Map<String, String&g ...

  7. MySQL的IFNULL简单使用说明

    MySQL IFNULL函数简介 MySQL IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数. 否则,IFNULL函数返回第二个参数. 两个参数可以是文 ...

  8. Maze 解题报告

    Maze Description   You are given a special Maze described as an n*m matrix, please find the shortest ...

  9. 一步一步学Silverlight 2系列(10):使用用户控件

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  10. 每次rand出来都是41?说好的随机数呢?!

    rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个"伪随机"整数,理论上可以产生的最大数值为2^16-1,即32767. rand()函数不接 ...