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. Design Pattern 设计模式1 - Strategy 1

    实现 : Defferent Heros attack Defferently. - 不同的英雄使用不用的招数 Strategy设计的思路: 基类A.更加小的基类B,新的继承类C: 1 从基类A中抽出 ...

  2. Cocos2d-js异步图片加载

    这里说的是在需要的使用加载图片,比如游戏中的某个关卡的图片,不用在游戏一开始就加载(万一用户玩不到那关,岂不是很冤,流量费了那么多),否则 载入速度也慢.这种方式加载资源要用到cc.loader官方文 ...

  3. td 中连续数字或连续英文内容不自动换行

    原因: 把连续的英文当做成了一个单词. 解决: 加上 : word-break: break-all (允许单词内换行)

  4. kafka2

    Master-Slave: 读写分离,save复制master的数据.同步复制:保证了强一致性但是会影响高可用性,因为写入的时候要保证slave都写入了才能返回告诉生产者数据写入成功,如果slave过 ...

  5. [arm驱动]Linux内核开发之阻塞非阻塞IO----轮询操作【转】

    本文转载自:http://7071976.blog.51cto.com/7061976/1392082 <[arm驱动]Linux内核开发之阻塞非阻塞IO----轮询操作>涉及内核驱动函数 ...

  6. 序列流、对象操作流、打印流、标准输入输出流、随机访问流、数据输入输出流、Properties(二十二)

    1.序列流 * 1.什么是序列流 * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.* 2.使用方式 * 整合两个 ...

  7. eclipse、idea切换大小写的快捷键

    idea : ctrl+shift+U切换大小写 eclipse : ctrl+shift+X 切换成大写 ctrl+shift+Y 切换成小写

  8. 解决VMware安装Ubuntu的过程中窗口过小无法看到【下一步】按钮的问题

    只要按住ALT键向上拖动窗口

  9. 不用打开Eclipse就可以执行的命令

    1.android 弹出Android SDK and AVD Manager2.android list avds 列出所有创建的Android模拟器3.android list targets 列 ...

  10. (转)Vim自动补全神器:YouCompleteMe

    原文出处:http://blog.jobbole.com/58978/ 第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就 ...