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 ...
随机推荐
- 【Scratch】编程?一节课就教会你!其实我们不用一个个学习如何使用代码。
第199篇文章 老丁的课程 在很多教程里面,大家都喜欢把模块拿出来一个个讲述其功能. 这样做的好处是,可以把每个代码模块的功能讲的很清楚.但最最讨厌的问题也随之而来…… 举个例子,当你学习英语的时候, ...
- Scratch:海龟绘图(九)
在本课的前导部分,我们说到怎么做才能成为一个负责任的“程序猿”.我认为,负责任的程序员决不会草率的处理任何“函数接口”. 比如这个“画圆”函数,程序员就会认真推敲“哪些参数是必要的.哪些参数又是多余的 ...
- Scratch第四十九讲:完美的下落和反弹
做了很多小游戏,都会遇到碰撞和反弹的情况,CC哥大多时候也都是简单处理一下,包括之前的讲座也有提过,但是没有认真的讲解过.今天就专门为这个主题做一讲,把这部分内容彻底讲透,大家可以一起探讨一下. 是不 ...
- YAML 语言格式
1. 认识 YAML YAML(Yet Another Markup Language)语言(发音 /ˈjæməl/ )是一个类似 XML.JSON 的标记性语言.YAML 强调以数据为中心,并不是以 ...
- Qt里的原子操作QAtomicInteger,有挑战性,使用Q_ATOMIC_INT{nn}_IS_SUPPORTED测试系统是否支持
所谓原子操作,即一系列复杂的操作能一气呵成,中间不被其他的操作打断.这在多线程程序中尤其常见,但要实现这种功能,既要考虑程序的良好设计,又要关心特定平台的体系结构和相关编译器对原子特性的支持程度.所以 ...
- [javascript]原生js实现Ajax
一.首先看JQuery提供的Ajax方法: $.ajax({ url: , type: '', dataType: '', data: { }, success: function(){ }, err ...
- (一)SpringMvc简介以及第一个springmvc工程
一.SpringMVC是什么? springmvc是Spring的一个模块,提供web层解决方案(就与MVC设计架构) 如上图, DispatcherServlet:前端控制器,由SpringMVC提 ...
- winform PictureBox图片上动态添加Label或其他控件
效果图: 代码: //分页或者多次加载时,需要删除之前产生的lable等控件 ; tabID < ; tabID++) { foreach (Control control in this.ta ...
- JDBC 复习1 DBUtil
package dbex; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; impo ...
- 在textarea和input光标处插入内容,支持ie
项目需求,用户要能够输入和点击外面的公式去插入到textaera中,试了好几种方法,有的是在谷歌下好使,在ie下不好使,最后找到了下面这个方法,目前在ie8以上都可以生效.直接上代码 function ...