xgzc— math 专题训练(二)
费马小定理&欧拉定理
费马小定理:
如果\(p\)是一个质数,而整数\(a\)不是\(p\)的倍数,\(a^{p-1}\equiv1\pmod p\)
欧拉定理:
当\(a\)与\(n\)互质时,\(a^b \equiv a^{b\%\phi(n)} \pmod n\)
扩展欧拉定理:
\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 专题训练(二)的更多相关文章
- xgzc— math 专题训练(一)
Lucas定理 当\(p\)是质数时,有\((^n_m)\equiv(^{n/p}_{m/p}) * (^{n\%p}_{m\%p}) \pmod{p}\) 狄利克雷卷积 定义:\((f*g)(n)= ...
- dp专题训练
****************************************************************************************** 动态规划 专题训练 ...
- DP专题训练之HDU 2955 Robberies
打算专题训练下DP,做一道帖一道吧~~现在的代码风格完全变了~~大概是懒了.所以.将就着看吧~哈哈 Description The aspiring Roy the Robber has seen a ...
- Microsoft .Net Remoting系列专题之二
Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- 转:【专题十二】实现一个简单的FTP服务器
引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...
- kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)
Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7949 Accepted: 42 ...
- kuangbin专题十二 POJ1661 Help Jimmy (dp)
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14214 Accepted: 4729 Descr ...
- kuangbin专题十二 HDU1176 免费馅饼 (dp)
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- git 去除版本控制
git会进入当前文件目录, 然后执行如下命令: find . -name ".git" | xargs rm -Rf 该项目就会去除git的版本控制了.再修改的话也不会影响git的 ...
- (六)mybatis之多对一关系(简单)
一.需求分析 需求: 查询所有订单信息及订单下的订单明细信息 分析: 一条订单只能由一个消费者下单,但是一条订单有多条订单明细. 二.创建数据库表和实体对象 Customer.java ...
- 在.netcore webapi项目中使用后台任务工具Hangfire
安装Hangfire 在webapi项目中通过nuget安装Hangfire.Core,Hangfire.SqlServer,Hangfire.AspNetCore,截止到目前的最新版本是1.7.6. ...
- nodejs连接mysql数据库,报错Client does not support authentication protocol requested by server的解决方法
最近想要尝试nodejs连接本地数据库,往全栈方向做一个小小的尝试,于是下载了一个 MySQL8.0,发现Navicat连接不上,结果就下载了mysql自身的Workbench,继续使用. 然而,难受 ...
- 傅里叶变换通俗解释及快速傅里叶变换的python实现
通俗理解傅里叶变换,先看这篇文章傅里叶变换的通俗理解! 接下来便是使用python进行傅里叶FFT-频谱分析: 一.一些关键概念的引入 1.离散傅里叶变换(DFT) 离散傅里叶变换(discrete ...
- vscode 基本知识以及如何配置 C++ 环境
参考: 在用VSCode? 看完这篇文章, 开发效率翻倍!最后一条厉害了~ Visual Studio Code(VS code)你们都在用吗?或许你们需要看一下这篇博文 按下 ctrl+K,再按下 ...
- 03 Django之视图函数
一.Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python函数(类),它接受WEB请求并返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- AngularJS入门教程之与服务器(Ajax)交互操作示例
AngularJS从Web服务器请求资源都是通过Ajax来完成,所有的操作封装在$http服务中,$http服务是只能接收一个参数的函数,这个参数是一个对象,用来完成HTTP请求的一些配置,函数返回一 ...
- weblogic快速安装版的安装和使用
weblogic 12c提供了一个225MB大小的zip包, 我们下载下来之后解压后, 到jdk的bin目录下面, 执行java -jar ORACLE_HOME=[webloigc安装jar包绝对路 ...
- 【转】DELPHI开始支持LINUX DOCKER
这是咏南翻译Marco Cantu的文章. 在过去的几年中,将服务器端解决方案(实际上是任何类型的应用程序)部署到轻量级DOCKER而不是物理机器或虚拟机已经变得越来越普遍,因为这允许更大的灵活性(在 ...