题目:

给你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. 最大公约数(gcd模板)

    int gcd(int a,int b) { ) { int t=a%b; a=b; b=t; } return a; }

  2. Java分享笔记:Map集合(接口)的基本方法程序演示

    package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { ...

  3. 【ACM之行】◇第一站◇ 2018HDU多校赛总结

    ◇第一站◇ 2018HDU多校赛 十场多校赛下来,也算是给一个初中生开了眼界……看着清华一次次AK(默默立下flag),看着自己被同校的高中生完虐,一个蒟蒻只能给dalao们垫脚

  4. 「译」setState如何知道它该做什么?

    本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...

  5. js开发中常用小技巧

    1.获取指定范围内的随机数 function getRadomNum(min,max){ return Math.floor(Math.random() * (max - min + 1)) + mi ...

  6. tp5.0初入

    1.目录结构 |-application 应用目录 是整个网站的核心 |---|---index 前台目录 |---|-----|---controller 控制器 |---|-----|---mod ...

  7. laravels -- Swoole加速php

    LaravelS是一个胶水项目,用于快速集成Swoole到Laravel,然后赋予它们更好的性能.更多可能性. 环境 : ubuntu16 + nginx + php7.1 + LaravelS搭建高 ...

  8. JAVA8新特性--集合遍历之forEach

    java中的集合有两种形式Collection<E>,Map<K,V> Collection类型集合 在JAVA7中遍历有一下几种方式:List<String> l ...

  9. Flask初学者:视图函数/方法返回值(HTML模板/Response对象)

    返回HTML模板:使用“from flask import render_template”,在函数中传入相对于文件夹“templates”HTML模板路径名称字符串即可(默认模板路径),flask会 ...

  10. SVD在推荐系统中的应用详解以及算法推导

    SVD在推荐系统中的应用详解以及算法推导     出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推 ...