EXBSGS
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的更多相关文章
- 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? ...
- BZOJ2480Spoj3105 Mod&BZOJ1467Pku3243 clever Y——EXBSGS
题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a=p ...
- BSGS与exBSGS学习笔记
\(BSGS\)用于解决这样一类问题: 求解\(A^x ≡B(modP)\)的最小\(x\),其中\(P\)为质数. 这里我们采用分块的方法,把\(x\)分解为\(i *t-b\)(其中\(t\)是分 ...
- hdu 2815 Mod Tree (exBSGS)
http://acm.hdu.edu.cn/showproblem.php?pid=2815 //解 K^D ≡ N mod P #include<map> #include<cma ...
- exBSGS·BSGS-Senior/扩展的BSGS
\(\rm{0x01\quad Preface}\) \(emmm\)严格来讲,不应该被算到一个模板里面.因为在我看来模板是人构造出来的,但是这个算法应该是一个解决问题的\(process\)-更像是 ...
- Luogu4195 【模板】exBSGS(exBSGS)
如果a和p互质,用扩欧求逆元就可以直接套用普通BSGS.考虑怎么将其化至这种情况. 注意到当x>=logp时gcd(ax,p)是一个定值,因为这样的话每个存在于a中的质因子,其在ax中的出现次数 ...
- BSGS&EXBSGS 大手拉小手,大步小步走
大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...
- exBSGS学习笔记
exBSGS学习笔记 Tags:数学 题目的话就做下洛谷的模板好了 // luogu-judger-enable-o2 #include<algorithm> #include<io ...
- 【模板】exBSGS/Spoj3105 Mod
[模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...
- MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS
思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj. ...
随机推荐
- Java 线程池ThreadPoolExecutor简单应用
什么是线程池: 线程池就是控制线程的一个池子.用来控制线程数量. 为什么要使用线程池: 1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时) 2.控制线程数量.线程过多 ...
- 关于用HOOK拦截键盘的一些问题
因为MSDN上说要这样做,所以我就这样做的,读懂MSDN是关键,下面来仔细阅读一下MSDN,看它到底是怎样描述的.阅读的时候我先给出原文,再进行自己的一些翻译或描述. 先看回调函数KeyboardPr ...
- MongoDB and Redis
简介 MongoDB更类似MySQL,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多 ...
- 两篇C++和VC++字符串的文章
有空挨个摘录写点心得 http://www.cnblogs.com/maowang1991/p/3572304.html http://www.cnblogs.com/maowang1991/p/35 ...
- 如何在 Ubuntu 云服务器上部署自己的 Rails 应用
安装步骤 参考:https://ruby-china.org/topics/32851 在云服务器上安装Ruby|Rails : http://www.cnblogs.com/znsongshu/p ...
- 如何在chrome上设置Bing为默认搜索引擎,在设置中无法直接设置
- async-await原理解析
在用async包裹的方法体中,可以使用await关键字以同步的方式编写异步调用的代码.那么它的内部实现原理是什么样的呢?我们是否可以自定义await以实现定制性的需求呢?先来看一个简单的例子: cla ...
- codeforces 691F F. Couple Cover(组合计数)
题目链接: F. Couple Cover time limit per test 3 seconds memory limit per test 512 megabytes input standa ...
- cmake官方文档
https://cmake.org/cmake/help/v3.0/genindex.html
- 中文环境下PostgreSQL的使用
虽然官方文档有提到编码的问题,但是对于中文讲的比较简单,给中文的PostgreSQL用户带来很多困扰,本文简单简述一下中文环境下PostgreSQL如何正确设置编码. 一.服务器端的编码设置 Post ...