POJ 3243 Clever Y | BSGS算法完全版
题目:
给你A,B,K
求最小的x满足Ax=B (mod K)
题解:
如果A,C互质请参考上一篇博客
将 Ax≡B(mod C) 看作是Ax+Cy=B方便叙述与处理.
我们将方程一直除去A,C的最大公约数进行变形,最终使得A和C互质.
将方程同除d1=gcd(A,C),得到B1=A/d1*Ax-1+C1y.有可能A和C1不互素,因此继续将方程同除d2=gcd(A,C1)得到B2=A2/d1d2*Ai-2+C2y.一直这样下去知道A和Ci互素.这里也能看出,若Bi不被gcd(A,Ci)整除则无解.
最终得到Bn=An/d1d2...dn*Ax-n+Cny,并记D=An/d1d2...dn,易证明gcd(D,Cn)=1,因此存在D的逆元,可以将最后的式子变为A x-n≡BnD-1(mod Cn),此时就能求解了.
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
typedef long long ll;
using namespace std;
ll x,z,k;
ll Gcd(ll x,ll y)
{
return y==?x:Gcd(y,x%y);
}
ll exGcd(ll a,ll b,ll &x,ll &y)
{
if (b==) return x=,y=,a;
ll r=exGcd(b,a%b,y,x);
y-=a/b*x;
return r;
}
ll inv(ll a,ll m)
{
ll x,y;
exGcd(a,m,x,y);
return (x%m+m)%m;
}
namespace Hash
{
const ll N=;
const ll H=;
struct adj
{
ll nxt,v,num,val;
}e[N];
ll head[H],ecnt=;
void init()
{
ecnt=;
memset(head,,sizeof(head));
}
void insert(ll x,ll val)
{
ll org=x;
x%=H;
for (int i=head[x];i;i=e[i].nxt)
{
if (e[i].num==org)
{
e[i].val=val;
return ;
}
}
e[++ecnt].num=org;
e[ecnt].val=val;
e[ecnt].nxt=head[x];
head[x]=ecnt;
}
ll query(ll x)
{
ll org=x;
x%=H;
for (int i=head[x];i;i=e[i].nxt)
if (e[i].num==org) return e[i].val;
return -;
}
}
ll BSGS(ll a,ll b,ll c)
{
ll cnt=,G,d=;
while ((G=Gcd(a,c))!=)
{
if (b%G!=) return -;
cnt++,b/=G,c/=G;
d=d*(a/G)%c;
}
b=b*inv(d,c)%c;
Hash::init();
ll s=sqrt(c*1.0);
ll p=;
for (int i=;i<s;i++)
{
if (p==b) return i+cnt;
Hash::insert(p*b%c,i);
p=p*a%c;
}
ll q=p,t;
for (int i=s;i-s+<=c-;i+=s)
{
t=Hash::query(q);
if (t!=-) return i-t+cnt;
q=q*p%c;
}
return -;
}
int check()
{
for (ll i=,j=;i<=;i++)
{
if (j==k)
{
printf("%lld\n",i);
return ;
}
j=j*x%z;
}
if (x==)
{
puts("No Solution");
return ;
}
return ;
}
int main()
{
while (scanf("%lld%lld%lld",&x,&z,&k) && x+z+k>)
{
x%=z,k%=z;
if (check()) continue;
ll ans=BSGS(x,k,z);
if (ans==-) puts("No Solution");
else printf("%lld\n",ans);
}
return ;
}
POJ 3243 Clever Y | BSGS算法完全版的更多相关文章
- POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)
不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...
- luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法
BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...
- POJ 3243 Clever Y 扩展BSGS
http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...
- poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】
扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...
- POJ 3243 Clever Y(离散对数-拓展小步大步算法)
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- [POJ 3243]Clever Y
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- POJ 3243 Clever Y Extended-Baby-Step-Giant-Step
题目大意:给定A,B,C,求最小的非负整数x,使A^x==B(%C) 传说中的EXBSGS算法0.0 卡了一天没看懂 最后硬扒各大神犇的代码才略微弄懂点0.0 參考资料: http://quarter ...
- poj 3243 Clever Y 高次方程
1 Accepted 8508K 579MS C++ 2237B/** hash的强大,,还是高次方程,不过要求n不一定是素数 **/ #include <iostream> #inclu ...
- 【POJ】3243 Clever Y
http://poj.org/problem?id=3243 题意:求$a^y \equiv b \pmod{p}$最小的$y$.(0<=x, y, p<=10^9) #include & ...
随机推荐
- C++声明之CV限定符
目录 1.const 1.1 const obj 如果调用 non-const member fun会编译出错 经典错误 1.2 例子:STD里的操作符重载 1.3 例子:<cpp primer ...
- HDU 1084 What Is Your Grade?(排序)
题目在这里:1084 题目描述: “Point, point, life of student!” This is a ballad(歌谣)well known in colleges, and yo ...
- flask实现基于elasticsearch的关键词搜索建议
1.实现效果 2.fuzzy模糊查询和suggest查询 fuzzy模糊查询 GET chaxun/job/_search { "query": { "fuzzy&quo ...
- angularjs处理多个$http
本文引自:https://www.cnblogs.com/xiaojikuaipao/p/6017899.html 在实际业务中经常需要等待几个请求完成后再进行下一步操作.但angularjs中$ht ...
- 「译」setState如何知道它该做什么?
本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...
- xml中encoding
前同天和同事在讨论xml里的encoding属性和文件格式的关系,终于彻底的弄清楚了.以前理解的是,xml里的encoding里定义必须与文件格式相匹配.即有这样的xml Introduction&l ...
- 图解HTTP总结(3)——HTTP报文内的HTTP信息
HTTP通信过程包括从客户端发往服务端的请求及从服务器端返回客户端的响应. 用于HTTP协议交互的信息被称为HTTP报文.客户端的HTTP报文叫做请求报文,服务器端的叫做响应报文.HTTP报文本身是多 ...
- MySQL的备份
MySQL的备份 开启MySQL的log_bin 执行查看mysql的log_bin状态 > show variables like 'log_bin%'; +----------------- ...
- paramiko基本操作
paramiko 是一个用作远程控制的模块,它遵循SSH2协议,支持以加密和认证的方式来进行远程服务器的连接.操作.上传和下载. 官方文档地址:http://docs.paramiko.org/ pa ...
- C++ 十进制 八进制 十六进制的转换和关系
在默认情况下,cout以十进制格式显示整数,而不管这些整数在程序中是如何书写的.如下面的程序所示: #include<iostream> using namespace std; #inc ...