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 & ...
随机推荐
- Python 初始—(字符编码解码)
字符编码之间的编码转换则需要通过Unicode 进行转换,那么需要一个编码和解码实现与Unicode进行关联转换 例如utf-8转gbk utf-8----decode----->Unicode ...
- 关于discuz 不能全文搜索的问题
这个问题客服反馈很多次了,以为discuz 默认搜索只能搜标题,除非配置了sphinx全文搜索引擎. 但是之前比较老的员工说以前能用的,也就是discuz老版本. 今天突然想到是不是discuz纵横搜 ...
- 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化
永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...
- php 微信公众号图文消息回复的实现 与access_token
//代码如下 <?phpclass IndexAction extends Action { public function __construct(){ } public function i ...
- SQL-批量插入和批量更新
批量插入 表结构一样或类似 如果两张表的结构一样,例如一个表的结构和另一个表的结构一样,只是其中一张是临时表,而另一张表是存储数据的表,我们需要进行一次表的迁移的话,我们可以这样. insert in ...
- 利用python进行坐标提取以及筛选(文件操作的小应用)
由于目前暂时还未学习到python关于数据处理的模块方面的知识,且刚好最近朋友发来一份坐标数据文件(txt格式),让我帮他对其进行筛选, 因此利用了最近刚学过的python文件处理操作以及以前所学的基 ...
- Skyscrapers Covered in Solar Pancels【太阳能电池板覆盖的摩天大楼】
Skyscrapers Covered in Solar Panels An office tower on Miller Stree in Manchester is completely cove ...
- 裸机——LCD
1.先了解显示器们 CRT显示器 原理,使用电子轰击荧光粉实现显示. 特点,主动发光,颜色绚丽,但是大. 等离子显示器(PDP) 原理,在显示屏上排列上千个密封的小低压气体室,通过电流激发使其发出肉眼 ...
- Educational Codeforces Round 37 E. Connected Components?(图论)
E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Bootstrap3适配IE8浏览器的方法
<!--[if lte IE 8]> <script src="js/respond.min.js"></script> <script ...