题目:

给你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算法完全版的更多相关文章

  1. 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 ...

  2. luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法

    BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...

  3. POJ 3243 Clever Y 扩展BSGS

    http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...

  4. poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】

    扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...

  5. POJ 3243 Clever Y(离散对数-拓展小步大步算法)

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

  6. [POJ 3243]Clever Y

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

  7. POJ 3243 Clever Y Extended-Baby-Step-Giant-Step

    题目大意:给定A,B,C,求最小的非负整数x,使A^x==B(%C) 传说中的EXBSGS算法0.0 卡了一天没看懂 最后硬扒各大神犇的代码才略微弄懂点0.0 參考资料: http://quarter ...

  8. poj 3243 Clever Y 高次方程

    1 Accepted 8508K 579MS C++ 2237B/** hash的强大,,还是高次方程,不过要求n不一定是素数 **/ #include <iostream> #inclu ...

  9. 【POJ】3243 Clever Y

    http://poj.org/problem?id=3243 题意:求$a^y \equiv b \pmod{p}$最小的$y$.(0<=x, y, p<=10^9) #include & ...

随机推荐

  1. top小火箭

    // my.js function $(id){return document.getElementById(id)};function show(obj){obj.style.display = & ...

  2. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  3. js函数的默认参数

    function f(flag, start, end, msg){ flag = flag == false ? flag : true; start = start || null; start ...

  4. OSI七层模型 学习摘要

    OSI参考模型是计算机网路体系结构发展的产物.它的基本内容是开放系统通信功能的分层结构.这个模型把开放系统的通信功能划分为七个层次,从邻接物理媒体的层次开始,分别赋于1,2,……7层的顺序编号,相应地 ...

  5. pytorch中如何使用预训练词向量

    不涉及具体代码,只是记录一下自己的疑惑. 我们知道对于在pytorch中,我们通过构建一个词向量矩阵对象.这个时候对象矩阵是随机初始化的,然后我们的输入是单词的数值表达,也就是一些索引.那么我们会根据 ...

  6. 呕心沥血写的python猜数字

    #猜数字 import random num_rd=random.randint(0,100) count=1 while 1<=count<=10: num_ip=input('请输入0 ...

  7. Postgres主备切换

    主备查询 主备不会自动切换(即需要实现线上环境主数据库宕掉之后,从数据库能够自动切换为主数据库,需要借用第三方软件,例如heartbeat等) (1)如何查看是primary还是standby 方法1 ...

  8. 笔记-docker-1

    笔记-docker-1 1.      简介 1.1.    什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问 ...

  9. mysql in和exists性能比较和使用【转】

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  10. Java线程和多线程(六)——守护线程

    当我们在Java中创建线程的时候,这个线程在默认的情况下是一个用户线程,并且,如果这个线程在运行,那么JVM就不会终结这个应用.和用户线程不同,当一个线程被标记为守护线程的时候,JVM在用户线程结束的 ...