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. ...
随机推荐
- Android - 监听Activity点击无效
监听Activity点击无效 本文地址: http://blog.csdn.net/caroline_wendy Activity须要先在Manifest注冊,才干在app中使用; Manifest: ...
- what's WSDL
WSDL (Web Services Description Language,Web服务描述语言) 它是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些 ...
- HTML——使用表格进行页面布局
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ossfs常见配置错误
以下问题出现在非root用户下 执行echo ××××> /etc/passwd-ossfs bash: /etc/passwd-ossfs: Permission denied 使用sudo ...
- jquery1.9是最后支持IE678
bootstrap 需要 jquery 1.9.1或更高 jquery1.9是最后支持IE678
- vue 做登陆页面 ( 登陆成功后去掉注册和登陆按钮 显示用户名)
1.当登陆成功 显示用户名且去掉登陆和注册按钮 2.data里声明 后 就在登陆的方法里调用啦 下面说一下登陆的方法. 1.登陆的按钮代码在第一张图片里 2.登陆的弹出框 3.方法 ps:另一种 ...
- html5--6-68 实战前的准备工作:了解HTML5大纲算法
html5--6-68 实战前的准备工作:了解HTML5大纲算法 学习要点 了解HTML5大纲算法 在html5中有一个很重要的概念,叫做HTML5大纲算法(HTML5 Outliner),它的用途为 ...
- poj 3461 Oulipo(kmp统计子串出现次数)
题意:统计子串出现在主串中的次数 思路:典型kmp #include<iostream> #include<stdio.h> #include<string.h> ...
- 收藏产品判断、html 在 UIwebView里面显示
收藏产品功能 要求:用户点击收藏,如果已经收藏,用户点击就取消收藏 写法一: 点击事件{ if (!isSelect) { [sender setImage:[UIImage imageNamed: ...
- ORACLE PL/SQL 实例精解之第二章 通用编程语言基础
通用编程语言基础 2.1PL/SQL编程基础 1. 字符类型:支持四中类型字符:字母,数字,符号和空格,组合一个或多个字符就会创建一个词汇单元 2. 词汇单元 a.标识符必须以字符开头 b.保留字是p ...