#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
using namespace std;
LL p,b,n; LL poww(LL a,LL b,LL p)
{
LL ans=;
while(b)
{
if(b&)ans=ans*a%p;
a=a*a%p;
b=b>>;
}
return ans;
}
LL bsgs(LL a,LL b,LL p)
{
map<LL,LL>mp;mp.clear();
LL m=ceil(sqrt(p*1.0));
for(int j=;j<=m;j++)
{
LL val=b*poww(a,j,p)%p;
mp[val]=j;
}
a=poww(a,m,p);
if(!a)return !b?:-;
for(int i=;i<=m;i++)
{
LL val=poww(a,i,p);
LL j=mp.find(val)==mp.end()?-:mp[val];
if(j>= && i*m-j>=)return i*m-j;
}
return -;
}
signed main()
{
while(cin>>p>>b>>n)
{
LL ans=bsgs(b,n,p);
if(ans==-)puts("no solution");
else cout<<ans<<endl;
}
}

用Hash会更快,map会多个log。

  ax≡b (mod p)

  令x=i*m-j,其中m=ceil(sqrt(p));

  ai*m-j≡b (mod p)

  ai*m≡b*aj (mod p)

  枚举j (0<=j<=m),map[ b*aj ]=j,

  若a=0,b!=0,则无解,a=0,b=0,则x=0;

  枚举i (1<=i<=m),找到第一个i,使ai*m≡b*aj (mod p)成立,i*m-j即为所求。

模板—BSGS的更多相关文章

  1. [模板] BSGS/扩展BSGS

    简介 前置知识: 快速幂&&O(1)快速乘 [模板] 数学基础:快速幂/乘/逆元/exGCD/(ex)CRT/(ex)Lucas定理

  2. 模板BSGS(SDOI2011计算器) 模板EXBSGS

    BSGS和EXBSGS是OI中用于解决A^xΞB(mod C)的常用算法. 1.BSGS BSGS用于A,C互质的情况. 令m=sqrt(C),此时x可表示为i*m+j. 式中i和j都<=sqr ...

  3. [模板] BSGS

    BSGS是一种解决一类专门的问题的解法,主要是解决已知A, B, C,求X使得A^x = B (mod p)这一类问题. 解法很简单,先设x = i*m-j(m=ceil(sqrt(p))),然后进行 ...

  4. noip考前抱佛脚 数论小总结

    exCRT 求解韩信点兵问题,常见的就是合并不同\(mod\). 先mo一发高神的板子 for(R i=2;i<=n;++i){ ll Y1,Yi,lcm=Lcm(p[i],p[1]); exg ...

  5. POJ2417 Discrete Logging【BSGS】(模板题)

    <题目链接> 题目大意: P是素数,然后分别给你P,B,N三个数,然你求出满足这个式子的L的最小值 : BL== N (mod P). 解题分析: 这题是bsgs算法的模板题. #incl ...

  6. BSGS 模板

    模板如下: 扩展版本: 求解a^k=b %p 求k,最小的k一定小于p,否则会重复,否则无解 *********************** gcd(a,p)=1时 设k=mi+v m=sqrt(p) ...

  7. U9249 【模板】BSGS

    题目描述 给定a,b,p,求最小的非负整数x 满足a^x≡b(mod p) 若无解 请输出“orz” 输入输出格式 输入格式: 三个整数,分别为a,b,p 输出格式: 满足条件的非负整数x 输入输出样 ...

  8. Bsgs模板

    模板最主要的是自己看得舒服,不会给自己留隐患,调起来比较简单,板子有得是,最主要的是改造出适合你的那一套.                  ——mzz #include<bits/stdc++ ...

  9. 算法笔记--BSGS && exBSGS 模板

    https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...

随机推荐

  1. springmvc 传参Required String parameter 'xxxx' is not present

    报错 请求因该是已经被分配了,但是参数补全,无法被执行 加上这个参数就好了,表示请求参数,可以为空 这样的好处是,可以进入controller之后再去判断,比较好定位错误

  2. 2019.9.19 csp-s模拟测试47 反思总结

    思路接近正解?都想到了?这都是借口呀. 没有用的,往前走吧. T1:Emotional Flutter 我的做法和题解不太一样,我把s放在最后考虑了. 因为出发以后步幅是一样的,所以每一个黑条可以ba ...

  3. SQL Sever实验一 创建和删除数据库数据表

    一. 实验目的 1. 熟悉SQL    Server    2008    中SQL    Server    Management    Studio的环境 2. 了解SQL    Server   ...

  4. 说说a标签的onclick和href

    在平时我们一般会在列表中的最后一列给加上操作功能,一般的操作功能是修改和删除,这个操作我们可以通过a标签来实现其功能. <a class="pn-opt" href=&quo ...

  5. Vue--moment时间格式插件安装和使用

    使用链接:http://momentjs.cn/ 1.安装monent 2.导入 3.过滤器   4.template模板使用:

  6. windows 下 解决 go get 或 dep init 更新不了问题

    首先你安装了Shadowsocks 并设置相应的代理,能够访问google等境外网站. 打开dos命令行窗口执行 如下图 这样你就能执行go get 或dep等命令,下载被墙的包了.以上方法为临时方法 ...

  7. Mybatis - plus 配置与运用

    Mybatis - plus mybatis-plus 官方文档  1.配置 引入对应的文件包,spring boot + mybatis 需添加依赖文件如下: <dependencies> ...

  8. 洛谷P1248 加工生产调度

    流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...

  9. 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线

    题目描述 数据范围 解法 考虑逐次加入每一条直线. 对于当前已加入的直线集合L,现在要新加入一条直线l. 那么它产生的贡献,与平行线有关. 对于任意三条直线,如果其中任意两条平行,那么将不做贡献. 所 ...

  10. 大数据技术之Zookeeper

    第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...