一名提高选手的数论之路(二)

2024-02-05 15:32
文章标签 数论 提高 一名 选手

本文主要是介绍一名提高选手的数论之路(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.乘法逆元(inv)两种求法:
First:(满足p为质数且a与p互质才可以使用)
根据费马小定理: apa(modp)
可得 ap2a1(modp)
由此可知, ap2modp 即是a在模p意义下的逆元
然而 ap2 可以轻易用快速幂算出
Second:(无条件)
通过扩展欧几里得算法来求: exgcd(a,p,x,y)
如此调用,x便是求得的a在模p意义下的逆元
不要问我为什么,我不想(zhi)说(dao)
记得答案是这样的(x+p)%p,因为要防止求出负数
代码就不用了吧。


2.在 O(n) 内求前n个逆元:
这是偶然从一个人的博客里看见的。
首先inv[1]=1
然后inv[i]=(M-M/i)*inv[M%i]%M
如此从2一直递推到n就可以了。
具体证明可以看出处
代码很简单:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int n,M;
int inv[100001];
int main(){scanf("%d %d",&n,&M);inv[1]=1;for(int i=2;i<=n;i++){inv[i]=(M-M/i)*inv[M%i]%M;}for(int i=1;i<=n;i++){printf("%d ",inv[i]);}return 0;
}

3.Lucas定理:(注意,在算阶乘数组的时候,必须从a[0]开始初始化,不然有可能错。)
这个定理是用来求大组合数取模的结果的。
具体证明呀什么的可以自己百度。
我这里给个公式:
C(n,m)=C(n%p,m%p)*C(n/p,m/p)
然后在计算的时候,只要递归地去计算右半部分就可以了,左半部分可以预处理出阶乘直接算,记得边算边取模就好。

//这是洛谷的模板题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
ll ksm(ll a,ll b,ll p){a%=p;ll ans=1;while(b){if(b&1){ans=(ans*a)%p;}a=a*a%p;b>>=1;}return ans;
}
ll a[100001];
ll cm(ll n,ll m,ll p){if(m>n)return 0;return (a[n]*(ksm(a[m],p-2,p))%p*(ksm(a[n-m],p-2,p))%p);
}
ll lucas(ll n,ll m,ll p){if(m==0)return 1;return (cm(n%p,m%p,p)%p*lucas(n/p,m/p,p)%p);
}
int main(){int T;scanf("%d",&T);for(int o=1;o<=T;o++){ll n,m,p;scanf("%lld%lld%lld",&n,&m,&p);memset(a,0,sizeof(a));a[0]=1;for(int i=1;i<=100000;i++){a[i]=(a[i-1]*i)%p;}printf("%lld\n",lucas(n+m,n,p));}return 0;
}

4.中国剩余定理(CRT):
用来求线性同余方程组,常用作合并答案
具体自己百度,我也没很弄懂,只是背了公式。

//代码未经测试,极有可能出错,仅供参考
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll q=exgcd(b,a%b,y,x);y-=a/b*x;return q;
}
ll inv(ll a,ll p){ll x,y;exgcd(a,p,x,y);return (x+p)%p;
} 
ll CRT(int n,ll *a,ll *m){ll M=1;for(int i=1;i<=n;i++){M*=m[i];}ll ans=0;for(int i=1;i<=n;i++){ll t=M/m[i];ll x=inv(t,m[i]);ans=(ans+a[i]*t*x)%M;}return (ans+M)%M;
}
int n;
ll a[100001];
ll m[100001];
int main(){return 0;
}

好多算法我还在看还没搞懂,之后发吧,比如什么扩展lucas

这篇关于一名提高选手的数论之路(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681360

相关文章

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

POJ2247数论

p = 2^a*3^b*5^c*7^d 求形如上式的第n小的数。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.u

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

如何提高开发的效率,让老板不知所措的给你发工资

设计模式 UML JSP 编程 数据结构 1.你可能会常常发现,写了一段代码后,编译程序时是一大堆的出错 (原因:语法不熟)  ──别担心,这是每个程序员必须经历的事,这时候你就需要更大的耐心及细心,对每一行代码进行仔细人阅读并改正,这个很重要,这可以培养你的理解代码能力,所以要常读程序,不要等到程序运行以后才知道你的程序的结果。  ──如何避免:在写代码以前,要认真的学习计算机语