费马小定理&欧拉定理

费马小定理:

如果\(p\)是一个质数,而整数\(a\)不是\(p\)的倍数,\(a^{p-1}\equiv1\pmod p\)

欧拉定理:

当\(a\)与\(n\)互质时,\(a^b \equiv a^{b\%\phi(n)} \pmod n\)

扩展欧拉定理:

\[a^b \equiv
\begin{cases}
a^b\pmod n (b<\phi(n))\\
a^{b\%\phi(n)+\phi(n)\pmod n (b\ge\phi(n))}\\
\end{cases}
\]

BSGS

求方程\(a^x\equiv b\pmod p\)(\(a\)与\(p\)互质)的解

取\(m=\lceil \sqrt p\rceil\),设\(x = m*i-j\)

那么易知,\((a^m)^i\equiv b*a^j\pmod p\)

我们可以把右边的全部丢到\(map\)里,然后枚举左边的,看看\(map\)中有没有


map<int, int> M;
int BSGS(int a, int b, int p) {
if (b == 1 && a) return 0;
M.clear(); int m = ceil(sqrt(p));
LL t = 1;
for (int i = 0; i < m; i++, t = t * a % p) M[t * b % p] = i;
for (int i = 1, s = t; i <= m + 1; i++, s = t * s % p) {
map<int, int> :: iterator it = M.find(s);
if (it == M.end()) continue;
return m * i - (it->second);
}
return -1;
}
int main() {
int a, b, p;
while (scanf("%d%d%d", &p, &a, &b) != EOF) {
int ans = BSGS(a, b, p);
if (ans == -1) puts("no solution");
else printf("%d\n", ans);
}
return 0;
}

EXBSGS

当\(a\)与\(p\)不互质时,就不能除过去。

考虑,\(a^x=p*z+b\)

我们取\(d = gcd(a,p)\)

如果\(b\)不是\(d\)的倍数显然无解

然后整体除\(d\)得到\(\frac{a}{d}a^{x-1}=\frac{p}{d}*z+\frac{b}{d}\)

显然可以递归处理。。

记录一下系数

然后最后回带一下即可。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int Mod = 1e5 + 7;
int gcd(int x, int y) {
return !y ? x : gcd(y, x % y);
}
struct Hash {
struct node {
int a, b, nxt;
} A[1000010];
int lst[Mod], tot;
void clear() { memset(lst, 0, sizeof(lst)); tot = 0; }
void add(int a, int b, int S) {
A[++tot] = (node) {a, b, lst[S]};
lst[S] = tot;
}
void insert(int a, int b) { add(a, b, a % Mod); }
int find(int x) {
for (int i = lst[x % Mod]; i; i = A[i].nxt)
if (A[i].a == x) return A[i].b;
return -1;
}
} M;
int exBSGS(int a, int b, int p) {
if (b == 1 && a) return 0;
int d, k = 0, s = 1;
while ((d = gcd(a, p)) > 1) {
if (b % d) { return -1; }
b /= d; p /= d; k++; s = 1ll * s * a / d % p;
if (s == b) { return k; }
}
M.clear(); int m = ceil(sqrt(p));
LL t = 1;
for (int i = 0; i < m; i++, t = t * a % p) M.insert(t * b % p, i);
s = t * s % p;
for (int i = 1; i <= m + 1; i++, s = t * s % p) {
int it = M.find(s); if (it == -1) continue;
return m * i - it + k;
}
return -1;
}
int main() {
int a, b, p;
while (scanf("%d%d%d", &a, &p, &b) != EOF) {
if (!a && !b && !p) return 0;
int ans = exBSGS(a, b, p);
if (ans == -1) puts("No Solution");
else printf("%d\n", ans);
}
return 0;
}

exLucas

二次剩余(Cipolla)

xgzc— math 专题训练(二)的更多相关文章

  1. xgzc— math 专题训练(一)

    Lucas定理 当\(p\)是质数时,有\((^n_m)\equiv(^{n/p}_{m/p}) * (^{n\%p}_{m\%p}) \pmod{p}\) 狄利克雷卷积 定义:\((f*g)(n)= ...

  2. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

  3. DP专题训练之HDU 2955 Robberies

    打算专题训练下DP,做一道帖一道吧~~现在的代码风格完全变了~~大概是懒了.所以.将就着看吧~哈哈 Description The aspiring Roy the Robber has seen a ...

  4. Microsoft .Net Remoting系列专题之二

    Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...

  5. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  6. 转:【专题十二】实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  7. kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)

    Treats for the Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7949   Accepted: 42 ...

  8. kuangbin专题十二 POJ1661 Help Jimmy (dp)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14214   Accepted: 4729 Descr ...

  9. kuangbin专题十二 HDU1176 免费馅饼 (dp)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 谷歌大脑提出:基于NAS的目标检测模型NAS-FPN,超越Mask R-CNN

    谷歌大脑提出:基于NAS的目标检测模型NAS-FPN,超越Mask R-CNN 朱晓霞发表于目标检测和深度学习订阅 235 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等价格 ...

  2. elasticsearch 集群详解

    ES为什么要实现集群 在单台ES服务器节点上,随着业务量的发展索引文件慢慢增多,会影响到效率和内存存储问题等. 如果使用ES集群,会将单台服务器节点的索引文件使用分片技术,分布式的存放在多个不同的物理 ...

  3. 解决https 请求过程中SSL问题

    最近一个项目中用到了https的请求,在实际调用过程中发现之前的http方法不支持https,调用一直报错. 查询了一下,添加几行代码解决问题. public string HttpPost(stri ...

  4. .net Core CLR

    .net Core CLR是开源的.大部分文件是C++写成.这样他就可以编译后再不同的平台运行. https://github.com/dotnet/coreclr

  5. 踩坑记录-nuxt引入vuex报错store/index.js should export a method that returns a Vuex instance.

    错误 store/index.js代码如下: import Vue from 'vue'; import Vuex from 'vuex'; import city from './moudle/ci ...

  6. 注解@Slf4j使用

    我们在写代码的时候需要加入日志打印,如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(XXX.class); 那么可以用注解 ...

  7. 数组的新API

    话不多数,直接上代码: 第一个输出1,2,3,4,5 在函数体中第一个console依次输出1,2,3,4,5 然后再将里面的内容逐个+1,所以第二个输出值为:2,3,4,5,6 但是这都不会改变原数 ...

  8. UIApplicationDelegate里面最常用的几个函数执行顺序小结

    (1)点击桌面图标正常启动App或者杀死进程后点击推送消息启动App 1.application:willFinishLaunchingWithOptions 2.application:applic ...

  9. elementUI .native修饰符

    用第三方组件或者UI框架会自带自身封装的事件,如keyup等,会覆盖原生的组件而无法起效果 .native 修饰符就是用来注册元素的原生事件而不是组件自定义事件的 如elementUI的:<el ...

  10. SpringCloud之RabbitMQ消息队列原理及配置

    本篇章讲解RabbitMQ的用途.原理以及配置,RabbitMQ的安装请查看SpringCloud之RabbitMQ安装 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. ...