欧拉函数&乘法逆元

扩展欧几里得算法 & 欧拉定理 求乘法逆元(无代码,仅示例计算方法) 目录 1 模m可逆元定义 2 扩展欧几里得算法求逆元 3 欧拉定理求逆元 1 模m可逆元定义 设m是一个正整数,a是一个整数。如果存在整数 a' 使得 成立,则 a 叫做 模 m 可逆元. 存在条件:a、m 互素 在模 m 的意义下,a' 是惟一存在的。这时 a' 叫做 a 的 模 m 逆元,记作 2 扩展欧几里得算法求逆元 由于 ,则满足方程的 x即为 a 模 b的逆元(同时 y 为 b 模 a 的逆元)。那么只需要使用扩展欧几里得求解,时间复杂度 ... 阅读详情

 

一、欧拉函数简单应用

·定义:

对于一个正整数n,它的欧拉函数的值即{p|p∈[1,n),p∈N+,p与n互质}的集合的大小,我们用φ(n)表示正整数n的欧拉函数

φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pk),其中p1~pk为n的质因数

附证明:https://blog.youkuaiyun.com/paxhujing/article/details/51353672

·性质:

1)如果n是素数,那么φ(n)=n-1,逆向也成立

2)如果n是素数,k是正整数,那么φ(n^k)=(n-1)*n^(k-1)

证明:显然一共有n^k-1个正整数,其中能被n^k整除的有n*t,t∈{1,2……n^(k-1)-1},所以有[(n^k)-1]-[n^(k-1)-1]个

3)如果m,n是互质的正整数,那么φ(mn)=φ(m)φ(n)

证明:m,n没有公共约数,我们令p1~pk1表示m的质因数,q1~qk2表示n的质因数,我们由计算公式可得:

φ(m)φ(n)=m(1-1/p1)(1-1/p2)……(1-1/pk1)n(1-1/q1)(1-1/q2)……(1-1/qk2)

φ(mn)=mn(1-1/p1)(1-1/p2)……(1-1/pk1)(1-1/q1)(1-1/q2)……(1-1/qk2)

4)n=p1^a1*p2^a2*……*pk^ak为n的素数幂分解(根据唯一分解定理),那么φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pk)

证明:你们一定行!

由性质3:

φ(n)=φ(p1^a1)φ(p2^a2)……φ(pk^ak)

=(p1-1)*p1^(a1-1)……(pk-1)*pk^(ak-1)

=p1^a1*……*pk^ak*(1-1/p1)*……*(1-1/pk)

5)一个数n的质因数的和=φ(n)*n/2

 

·练习:

#oj3623 Relatives

题目大意:求φ(n)

模板题,不难想到利用性质4来求φ(n),显然我们需要进行质因数分解,代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int euler1(int m){//直接求 
	int ans=m;
	for(int i=2;i<=m;i++){
		if(m%i==0){
//			ans=ans*(1-1/i)=>
//			ans=ans-ans/i=>
			ans=ans/i*(i-1);//防止溢出 
			while(m%i==0)m/=i;
		}
	}return ans;
}
int euler2(int m){//O(√n)
	int ans=m;
	for(int i=2;i*i<=m;i++){//任意一个合数都有不大于根号n的约数 
		if(m%i==0){
			ans=ans/i*(i-1);
			while(m%i==0)m/=i;
		}
	}if(m>1)ans=ans/m*(m-1);//最后的pk 
	return ans;
}
#define MAXN 100001
int euler[MAXN];
int euler3(int m){//筛法求euler函数O(n),假的,千万级就跑得很慢了 
	for(int i=1;i<=m;i++)euler[i]=i;
	for(int i=2;i<=m;i++)if(euler[i]==i){//利用性质1 
		for(int j=i;j<=m;j+=i)euler[j]=euler[j]/i*(i-1);
	}return euler[m];
}
main(){
	while(~scanf("%lld",&n)&&n)cout<<euler1(n)<<""<<euler2(n)<<""<<euler3(n)<<"\n";

 

#oj3624 原根

 

题目大意:给定奇素数,求它的原根

原根是个数学符号,它的定理:n的原根为φ(φ(n)),当结论背下来吧,感兴趣的同学可以去网上找这方面的资料

 

#oj2904 MMT数

题目大意:给定一个数n,需要我们求n与x不互质且x不为n的约数的个数(x<=n)

发现正面求解不太好搞,我们考虑逆向求解

对于第一个条件(求互质):ans1=n-φ(n)

对于第二个条件(求约数个数):我们由素数幂分解得到ans2=(a1+1)(a2+1)……(ak+1)个(详见性质4)

于是我们就得到了最终答案:ans=n-ans1-ans2个?

注意1又是n的约数且含在了φ(n)中,所以算了两次,因此我们要+1

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100001
int n,q,ans1,ans2,cnt[MAXN];
void euler(int m){
	ans1=m,ans2=1;
	for(int i=2;i*i<=m;i++){
		if(m%i==0){
			ans1=ans1/i*(i-1);
			++q;
			while(m%i==0)m/=i,++cnt[q];//求ak的大小
		}
	}
	for(int i=1;i<=q;i++)ans2*=(cnt[i]+1);//+1?0次方,即不要它自己 
	if(m>1)ans1=ans1/m*(m-1),ans2*=2;//因为我们是取的根号,还有一半的约数个数没有取到 
}
int main(){
	scanf("%d",&n);
	euler(n);
	cout<<n-ans1-ans2+1<<"\n";//+1?因为1与n互质且为n的约数 
	return 0;
}

 

#oj2602 Farey Sequence

 

题目大意:给定一个数n,2~n的欧拉函数之和

去水题吧,注意要开longlong,而且数据貌似改了,不用特判n=1的

 

#oj2827 仪仗队

题目大意:见题面(有点长哇)

 

#oj2612 最大公约数

题目大意:优化如下代码

Int sum=0;

For(i,1,n-1)

For(j,i+1,n)sum+=gcd(i,j)

多组数据Case<=2e4,n<=1e6

对于一组Gcd(i,n),我们这样考虑:

Gcd(i*pi,n)=pi即Gcd(i,n/pj)=1,而我们可以求出满足Gcd(i,n/pj)=1的i有φ(n/pj)个,所以Gcd(i*pi,n)=pi也有φ(n/pj)个,那么对于一个单独n:(n)+=φ(n/pi)*pi,pi为n的因数

而对于此题,我们只需递推出所有状态就好了

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define MAXN 1000001
int r,n,q[MAXN],euler[MAXN];
void init(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)scanf("%lld",q+i);
	for(int i=1;i<=n;i++)r=max(r,q[i]);
}
void calc(){
	for(int i=1;i<=r;i++)euler[i]=i;
	for(int i=2;i<=r;i++)if(euler[i]==i){
		for(int j=i;j<=r;j+=i)euler[j]=euler[j]/i*(i-1);
	}
}
int f[MAXN];
void solv(){//对于每一个询问n+=euler[pi]*pi
	for(int pi=1;pi<=r;pi++)//公约数大小 
		for(int n_pi=2;n_pi<=r/pi;n_pi++)f[pi*n_pi]+=euler[n_pi]*pi;//注意n/pi不能为本身,因为没有意义
		//gcd(x,n)=pi
		//gcd(x/pi,n/pi)=1 
	for(int i=1;i<=r;i++)f[i]+=f[i-1];
	for(int i=1;i<=n;i++)cout<<f[q[i]]<<"\n";
}
main(){
	init();
	calc();
	solv();
}

 

#oj3224 longge的问题

题目大意:给定一个整数n,求sum gcd(i,n)(1<=i<=n)

上一道题都成功解决,这一道题就不说了,只是注意n∈(0,2^32),因此不能开数组,而应该实时计算(见第二种写法)

#oj2819 沙拉公主的困惑(逆元)

#oj4780 奇数国(逆元)

#oj1316 机器人M号(逆元)

 

二、乘法逆元

·定义:

对于整数a,p,若存在一个整数x,使ax≡1 (mod p)即ax%p=1成立,则称x是a对p的逆元(当且仅当gcd(a,p)=1时,才存在且存在唯一逆元),我们用inv(a)表示x

·应用:

模意义下除法不能直接操作,因此要引入逆元(还有加法逆元等,一般指乘法逆元)

·求法:

·费马小定理:若p是质数且gcd(a,p)=1,则a^(p-1)≡1 (mod p)

显然我们有a*a^(p-2)≡1 (mod p),即inv(a)=a^(p-2),用快速幂计算inv(a),复杂度log2(a),当模数p是质数时,用费马求解

·欧拉定理:若gcd(a,p)=1,则a^(φ(p))≡1(mod p)

显然此时inv(a)=a^(φ(p)-1),使用欧拉函数+快速幂计算,复杂度同费马,但较费马而言,模数p可以不为质数,因此应用范围广一点

·扩展欧几里得:若gcd(a,b)=1,则ax+by=1

这个不定方程的解x就是a对b的逆元,y就是b对a的逆元

证明:显然ax%b+by%b=1%b=>ax%b=(1%b)=1=>ax≡1 (mod b)

·线性递推:当p是质数的时候,inv(a)=(p-p/a)*inv(p%a)%p

证明:设x=p%a,y=p/a,则有:

x+ay=p=>

(x+ay)%p=0=>

x*inv(a)%p=(p-y)%p=>

inv(a)=(p-y)*inv(x)%p=>

inv(a)=(p-p/a)*inv(p%a)%p

·练习:

#5208乘法逆元(模板题)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p;
struct FEIMA{
	inline int pow_mod(int a,int b,int p){//a的b次方求余p快速幂 
    	int ret=1;
    	while(b){
       		if(b&1)ret=(ret*a)%p;
        	a=(a*a)%p;
        	b>>=1;
    	}return ret;
	}
	inline int FeiMaX(int a,int p){//费马求a关于b的逆元 
    	return pow_mod(a,p-2,p);
	}
	inline void solv(){
		for(int i=1;i<=n;i++)cout<<FeiMaX(i,p)<<"\n";
	}
}s1;
struct OULA{
	int Eulerp;
	inline int pow_mod(int a,int b,int p){
    	int ret=1;
    	while(b){
       		if(b&1)ret=(ret*a)%p;
        	a=(a*a)%p;
        	b>>=1;
    	}return ret;
	}
	inline int OuLa(int a,int p){
		return pow_mod(a,Eulerp-1,p);
	}
	inline int euler(int m){
		int ans=m;
		for(int i=2;i*i<=m;i++){
			if(m%i==0){
				ans=ans/i*(i-1);
				while(m%i==0)m/=i;
			}
		}if(m>1)ans=ans/m*(m-1);
		return ans;
	}
	inline void solv(){
		Eulerp=euler(p);
		for(int i=1;i<=n;i++)cout<<OuLa(i,p)<<"\n";
	}
}s2;
struct EXGCD{
	inline void exgcd(int a,int b,int &x,int &y,int &d){
    	if(!b)d=a,x=1,y=0;
    	else exgcd(b,a%b,y,x,d),y-=x*(a/b);
    }
	inline int inv(int a,int b){
    	int d,x,y;
    	exgcd(a,b,x,y,d);
    	return d==1?(x%p+p)%p:-1;
	}
	inline void solv(){
		for(int i=1;i<=n;i++)cout<<inv(i,p)<<"\n";
	}
}s3;
struct Line{
	#define MAXN 3000010
	int inv[MAXN];
	inline void solv(){
		inv[1]=1;
		for(int i=2;i<=n;i++)inv[i]=(p-p/i)*inv[p%i]%p;
    	for(int i=1;i<=n;i++)cout<<inv[i]<<"\n";
	}
}s4;
main(){
    scanf("%lld%lld",&n,&p);
    s1.solv();//费马小定理 
	s2.solv();//欧拉函数 
    s3.solv();//扩展欧几里得 
	s4.solv();//线性递推 
}

 

学了乘法逆元,我们就能ac前面的几道题了!

 

#oj2819 沙拉公主的困惑

题目大意:给定正整数n,m,p,求(0,n!]中所有与m!互质的数的个数%p(数据默认n>m)

我们还是先研究局部(因为n!必然能够被m!整除),对于一个区间m!,如果找到了一个数p与m!互质,那么,p+m!,p+2*m!,……,p+(n!/m!-1)*m!都与p是相同性质的,因此我们的答案即ans(m!)*(n!/m!)即φ(m!)*(n!/m!),我们将它展开得到:n!*(1-1/p1)……(1-1/pk)=>n!*[(p1-1)/p1]……[(pk-1)/pk],又因为n,m<=10000000而且内存限制足够大,暴力预处理即可

/* 
暴力处理n!:n数组
处理1-1/pi:inv数组(逆元),key数组(表示(1-1/p1)……(1-1/pk))
对于每个key[m],我们这样考虑:
当m为素数时,显然key[m]=key[m-1]*(1-1/m)
当m不为素数,我的m肯定能被分成若干小于m的合数积,因此key[m]=key[m-1] 
*/
#include<bits/stdc++.h>
using namespace std;
#define N 10000000
#define int long long
int cas,p;
int key[N+10];
int inv[N+10];
int cnt,prime[N+10];
bool vst[N+10];
inline void prepP(){//欧拉素数筛 
	for(int i=2;i<=N;i++){
		if(!vst[i])prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=N;j++){
			vst[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
inline void prepVK(){
	inv[1]=1;
	for(int i=2;i<=N;i++)inv[i]=(p-p/i)*inv[p%i]%p;//逆元 
	key[1]=1;
	for(int i=2;i<=N;i++){
		key[i]=key[i-1];//
		if(!vst[i])key[i]=key[i]*(i-1)%p*inv[i]%p;
	}
}
int n[N+10];
inline void prepN(){
	n[1]=1;
	for(int i=2;i<=N;i++)n[i]=n[i-1]*i%p;
}
main(){
	scanf("%lld%lld",&cas,&p);
	prepP();
	prepVK();
	prepN();
	while(cas--){
		int x,y;scanf("%lld%lld",&x,&y);
		printf("%lld\n",n[x]*key[y]%p);
	}
}

 

 

 

#oj4780 奇数国(线段树+欧拉+逆元)

题目大意:看题目……

好题,我们很容易想到答案即φ(TTr/TT/(l-1)),即TT(l~r)*(1-1/p1)*(1-1/p2)……(1-1/pk),我们又注意到总共只有60个质因数……

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int get(){register int re=0,f=1;register char c;while(c=getchar(),(c>='0'&&c<='9')^1)f=c^'-';while(re=(re<<1)+(re<<3)+(c^48),c=getchar(),(c>='0'&&c<='9'));return f?re:-re;}
#define N 100000
#define p 19961993
#define FOR(i,L,R) for(register int i=(L);i<=(R);++i)
bool vst[287];
int inv[287],prime[67];
struct Seg{
	ll c[N*4];
	bitset<61>s[N*4];
	#define ls v<<1
	#define rs v<<1|1
	inline void cull(int v,int k){
		c[v]=k;
		s[v]=0;
		FOR(i,1,60)if(k%prime[i]==0)s[v][i]=1;
	}
	inline void maintain(int v){
		c[v]=c[ls]*c[rs]%p;
		s[v]=s[ls]|s[rs];
	}
	inline void Modify(int v,int L,int r,int x,int k){
		if(L>x||r<x)return ;
		if(L==r)return cull(v,k),void();
		int Mid=L+r>>1;
		Modify(ls,L,Mid,x,k),Modify(rs,Mid+1,r,x,k);
		maintain(v);
	}
	inline pair<ll,bitset<61> > query(int v,int L,int r,int a,int b){
		if(L>b||r<a)return make_pair(1,0);
		if(a<=L&&r<=b)return make_pair(c[v],s[v]);
		int Mid=L+r>>1;
		pair<ll,bitset<61> >Left=query(ls,L,Mid,a,b);
		pair<ll,bitset<61> >Right=query(rs,Mid+1,r,a,b);
		return make_pair(Left.first*Right.first%p,Left.second|Right.second);
	}
	inline void build(int v,int L,int r){
		if(L==r)return cull(v,3),void();
		int Mid=L+r>>1;
		build(ls,L,Mid),build(rs,Mid+1,r);
		maintain(v);
	}
}t;
inline void prep(){
	FOR(i,2,281){
		if(!vst[i])prime[++prime[0]]=i;
		for(int j=1;j<=prime[0]&&i*prime[j]<=281;j++){
			vst[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}inv[1]=1;
	FOR(i,2,281)inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}
inline void GetAns(int a,int b){
	pair<ll,bitset<61> >ans=t.query(1,1,N,a,b);
	FOR(i,1,60)if(ans.second[i])ans.first=(ll)ans.first*(prime[i]-1)*inv[prime[i]]%p;
	cout<<ans.first<<"\n";
}
inline void Change(int x,int k){
	t.Modify(1,1,N,x,k);
}
int main(){
	prep();
	t.build(1,1,N);
	int cas=get();
	FOR(i,1,cas){
		int opt=get(),a=get(),b=get();
		if(opt==0)GetAns(a,b);
		if(opt==1)Change(a,b);
	}return 0;
}
//两颗线段树维护,一颗维护乘积,一颗维护哪些素数出现过
#include<bits/stdc++.h>
using namespace std;
#define N 100000
#define p 19961993
#define int long long
#define FOR(i,L,R) for(register int i=(L);i<=(R);i++)
bool vst[290];
int prime[61],inv[290];
int BIT[61]={1};
inline void prep(){
	FOR(i,1,60)BIT[i]=BIT[i-1]<<1;
	FOR(i,2,281){
		if(!vst[i])prime[++prime[0]]=i;
		for(int j=1;j<=prime[0]&&i*prime[j]<=281;j++){
			vst[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}inv[1]=1;
	FOR(i,2,281)inv[i]=(p-p/i)*inv[p%i]%p;
//	int ans=0;FOR(i,1,61)ans+=BIT[i];cout<<BIT[62]<<' '<<ans<<"\n";
}
struct Segment{
	int c[2][N*10];
	inline void maintain(int f,int v){
		f?c[f][v]=c[f][v<<1]|c[f][v<<1|1]:c[f][v]=c[f][v<<1]*c[f][v<<1|1]%p;
	}
	inline void cull(int f,int v,int k){
		c[f][v]=f?0:k;
		if(f)FOR(i,1,60)if(k%prime[i]==0)c[f][v]+=BIT[i];//压位,表示第i个素数出现过 
	}
	inline int query(int f,int v,int L,int r,int a,int b){
		if(L>b||r<a)return f^1;
		if(a<=L&&r<=b)return c[f][v];
		int Mid=L+r>>1;
		return f?query(f,v<<1,L,Mid,a,b)|query(f,v<<1|1,Mid+1,r,a,b):query(f,v<<1,L,Mid,a,b)*query(f,v<<1|1,Mid+1,r,a,b)%p;
	}
	inline void Modify(int f,int v,int L,int r,int x,int k){
		if(L>x||r<x)return ;
		if(L==r)return cull(f,v,k),void();
		int Mid=L+r>>1;
		Modify(f,v<<1,L,Mid,x,k),Modify(f,v<<1|1,Mid+1,r,x,k);
		maintain(f,v);
	}
	inline void build(int f,int v,int L,int r){
		if(L==r)return cull(f,v,3),void();
		int Mid=L+r>>1;
		build(f,v<<1,L,Mid);
		build(f,v<<1|1,Mid+1,r);
		maintain(f,v);
	}
}t;
inline void GetAns(int a,int b){
	int ans1=t.query(0,1,1,N,a,b),ans2=t.query(1,1,1,N,a,b);
	for(int i=1;i<=60;i++)
		if(ans2&BIT[i])ans1=ans1*(prime[i]-1)*inv[prime[i]]%p;
	cout<<ans1<<"\n";
}
inline void Change(int x,int k){
	t.Modify(0,1,1,N,x,k);
	t.Modify(1,1,1,N,x,k);
}
main(){
	prep();
	t.build(0,1,1,N);
	t.build(1,1,1,N);
	int cas;scanf("%lld",&cas);
	int opt,a,b;
	while(cas--){
		scanf("%lld%lld%lld",&opt,&a,&b);
		if(opt==0)GetAns(a,b);
		if(opt==1)Change(a,b);
	}
}

 

 

#oj1316 机器人M号(dp+欧逆)

题目大意:见题面……

思路?代码?我不会……

 

 

 

逆元的概念及求解方法 逆元 逆元概念 引入逆元 数论中的 (a / b)% p 运算很不方便,而且对p同余不满足同除性,因此引入逆元将整除运算转换为整数乘法运算,会更有助于计算。 定义 若 a * x ≡ 1 (mod) b, a, b 互质,则称 x 为 a 的逆元,标记为 a -1。 逆元也可认为是数论意义上的倒数。 a 模 b 意义上的逆元不唯一,一般方便计算,取(0,b - 1]范围的逆元。 用法 逆元可以用来计算(t / a)mod b 时,转化为 t * a-1 mod b 两表达式同余证明: (t / a 阅读详情

相关推荐

乘法逆元及两道模板题详解

乘法逆元 就是 此时b就是a模p意义下的逆元,即 下面我们用inv[a]表示a模p意义下的逆元。 逆元是好东西啊 有时候我们需要算出 a/b mod p 的值,用朴素的方法,我们只能在 a 上不断加 p ,直到它能被 b 整除为止。 当 a,b,p 都很大的时候,这种方法就只能凉凉了,但如果有了逆元,我们就可以非常方便,快捷地求解。 ...

qq_42701791的博客 2648

入门算法之乘法逆元与拓展欧几里得与欧拉函数(面向新生)讲解及其各种求法

逆元在咱们做题中出现的频率还是很高的,往往用来求解分数取余中,例如cnm(组合数),而且可以求解1e6之内的组合数%p; 首先看一下百度百科的解释: 乘法逆元,是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a',具有性质a×a'=a'×a=e,其中e为该群的单位元。 通俗一点,就是定义在一种运算里面的数都存在一个唯一的逆元,使得a×a的逆元为单位元,我...

weixin_43916298的博客 1001

乘法逆元数论篇【ORZ式教学】

引入篇乘法逆元较多用于求解除法取模问题 例如:(a/b)%m时,可以将其转换为(a%(b×m))/b,但这样求解的过程依然涉及到除法,所以我们应当避免除法的直接计算。这时候就需要用到我们要讲的乘法逆元。 可以使用逆元将除法转换为乘法:假设b存在乘法逆元,即与m互质(充要条件)。 设c是b的逆元,即 b×c≡1(mod m) 那么有 a/b=(a/b)×1=(a/b)×b×c=a×c(m

Learning Deep Learning 1364

乘法逆元 (扩展欧几里得或费马小定理)

欧拉定理(又称费马-欧拉定理):已知a和n为正整数,并且a和p互素,则a^phi(n) ≡ 1(mod n)。 证明:   设集合Z = {X1, X2, X3, .... , Xphi(n)},其中Xi (i = 1, 2, .. phi(n))表示第i个不大于n与n互质的数。   考虑集合S = {a*X1(mod n), a*X2(mod n), ... ,a*Xphi(n

hlmfjkqaz的专栏 1656

SCCM实战指南:从零搭建企业级Windows自动化部署平台

本文提供了一份详细的SCCM实战指南,手把手教你从零搭建企业级Windows自动化部署平台。内容涵盖环境规划、AD架构扩展、SQL Server配置、SCCM主站点安装,以及最终实现操作系统镜像的自动化部署,旨在帮助IT管理员彻底告别手动装机,实现高效、规范的Windows设备批量管理。

weixin_29251337的博客 638

一文读懂,WMS仓库管理系统模块功能

对于仓库管理人员来说,仓储管理是一件需要十分负责、又精细化的工作。

深蓝易网的博客 5218

数论 - 多种方法求乘法逆元

求乘法逆元的5种方法 求正整数a关于1模p的的乘法逆元,即求满足ax≡1(mod&nbsp;p)的正整数解x。求正整数a关于1模p的的乘法逆元,即求满足ax≡1(mod\ p)的正整数解x。求正整数a关于1模p的的乘法逆元,即求满足ax≡1(mod&nbsp;p)的正整数解x。 文章目录求乘法逆元的5种方法一、扩展欧几里得算法(O(logP))扩展欧几里得算法(O(logP))扩展欧几里得算法(O(logP))二、费马小定理(O(logP))二、费马小定理(O(logP))二、费马小定理(O(logP))三

njuptACMcxk的博客 760

基于STM32+OV7670的图像采集系统(基础篇:ov7670介绍)

一、简单认识 先来看一下外观: OV7670,图像传感器,体积小,工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输入整帧、子采样、取窗口等方式的各种分辨率8位影像数据。 其他介绍比较繁琐,这里就不一一赘述了,我们只需要知道它是通过SCCB总线控制的就行了。 带FIFO与不带FIFO 目前市场上购买的ov7670模块分为两种,一种是不带FIFO芯片、一种是带FIFO芯片的。 FIFO是什么:(First Input First Output)先入先出的意思,

m0_59113542的博客 4万+

数论-乘法逆元【裴蜀定理+欧拉定理/费马小定理】

裴蜀定理 定义:若a,b是整数,且gcd(a,b)= d,那么对于任意的整数x,y,ax+by 都一定是 d 的倍数,特别地,一定存在整数x,y,使 ax+by = d 成立。(根据拓展欧几里得定理得出 ax + by = gcd(a,b)) 这篇博客提到拓展欧几里的公式及推到 一个重要推论是:a,b互质的充要条件是存在整数x,y使 ax+by = 1 证明这里就不详细说了,参考博客:https://blog.youkuaiyun.com/leader_one/article/details/75298966 推论

qq_53269459的博客 947

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 340

SAP WMS开发实战:用BAPI_L_TO_CREATE_MULTIPLE搞定LT01转储单(附完整代码)

本文详细解析了SAP WMS开发中如何利用BAPI_L_TO_CREATE_MULTIPLE函数模块批量创建LT01转储单。文章深入剖析了核心参数、常见错误及实战代码框架,重点强调了源/目标存储类型等关键字段的获取方法,为系统集成与自动化流程开发提供了可靠的解决方案。

view3的博客 561

BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)

3813: 奇数国 Time Limit:10 SecMemory Limit:256 MBSubmit:755Solved:432[Submit][Status][Discuss] Description 在一片美丽的大陆上有100000个国家,记为1到100000。这里经济发达,有数不尽的账房,并且每个国家有一个银行。某大公司的领袖在这100000个银行开户时都存...

weixin_30746117的博客 114

C语言 100道经典编程题适用于专升本,专接本【详细分析版】_c语言专升本题目

/法2//left指向起始 right指向数组末尾= 0){left++;//如果*left是奇数就循环接着向后指,直到指向偶数就退出//(left

2401_84978503的博客 695

求解乘法逆元的方法

求解乘法逆元有三种常用方法: 1、费马小定理/欧拉函数 2、扩展欧几里德算法 3、线性求逆元 取模公式 (a+b)&nbsp;mod&nbsp;p=(a&nbsp;mod&nbsp;p+b&nbsp;mod&nbsp;p)&nbsp;mod&nbsp;p(a+b)~mod~p=(a~mod~p+b~mod~p)~mod~p(a+b)&nbsp;mod&nbsp;p=(a&nbsp;mod&nbsp...

默的博客 4575

ORB-SLAM3在windows11下的编译使用

近期在学习SLAM,想部署一下ORB-SLAM3,但是自己电脑是win11系统,因此就想着在win11上部署一下。但是网上看了一些教程,有一些博客,但是可能不适合我这种情况把,就很纠结。先说下结果,配置成功,过程极其痛苦。

weixin_44457768的博客 6095

innovus:Clock Gating Check设置与报告

看图后发现,在设置clock gating check之前报告也会有clock gating check的值,这个就是因为timing library中会像reg一样定 library setup time值,如下图。我们常用set_clock_gating_check -setup去过约束Place阶段reg2cgate的时序,以防CTS后由于tree不平导致的时序违例。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1011

乘法逆元小结

在求解除法取模问题时(a/b)%m (a/b) \% m,我们可以转化为(a%(b∗m))/b(a \% (b * m))/b, 但是如果b很大,则会出现精度问题,所以我们避免使用除法直接计算。 可以使用逆元将除法转换为乘法: 假设b存在乘法逆元,即与m互质(充要条件)。设c是b的逆元,即b∗c≡1(modm)b * c \equiv 1 (modm),那么有a/b=(a/b)∗1=(a/b)

Tuesday 9797

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

乘法逆元(inverse element)及四大相关求法详解(含证明)

若整数 a,m 互质,并且对于任意的整数 b,如果满足 a | b ( a 能整除 b ),则存在一个整数 x,使得 b/a ≡ bx ( mod m ) ,则称 x 为 a 模 m 的乘法逆元,记为 a^{−1}( mod m ) 或者 inv( a )。

qq_63786973的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

乘法逆元数论篇

乘法逆元数论篇【易懂教学】 引入篇乘法逆元较多用于求解除法取模问题 例如:(a/b)%m时,可以将其转换为(a%(b×m))/b,但这样求解的过程依然涉及到除法,所以我们应当避免除法的直接计算。这时候就需要用到我们要讲的乘法逆元。 可以使用逆元将除法转换为乘法:假设b存在乘法逆元,即与m互质(充要条件)。 设c是b的逆元,即 b×c≡1(mod m) 那么有 a/b=(a/b)×1=

南风古 2129

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【数论】乘法逆元

尊重原创,参考的博客: Judge's_class Here_jiaxinwei 欧拉-费马小定理定理(证明及推论) 逆元详解 逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等) 题目:CF696C  题解 题解 对于求解乘法逆元有三种方法: 1、拓展欧几里得 2、费马小定理 3、线性推导逆元 1、拓展欧几里得: 以下是公式推导: 由于,在mod ...

Z_sea的博客 1007

【互质数的个数——欧拉函数,乘法逆元,快速幂】

至于phi(998244353 * 2) ,因为gcd(998244353,2) = 1,根据可积性,phi(...) = phi(998244353) * phi(2) = 998244352。也就是b > 1,phi(a ^ b) 一定是p的倍数,res = 0。当b = 1,phi(a = 998244353) = a - 1,当b > 1,可用。看别人题解的时候,有一个地方引起了我的注意。

Kent的博客 998

『数论』乘法逆元

在求解除法取模问题 (a/b)%m(a/b)\%m 时,我们可以转化为 (a%(b×m))/b(a\%(b×m))/b ,但是如果 bb 很大,则会出现爆精度问题,所以我们避免使用除法直接计算。可以使用逆元将除法转换为乘法:假设 bb 存在乘法逆元,即与 mm 互质(充要条件)。设 cc 是 bb 的逆元,即 b×c≡1(mod m)b×c≡1(mod~m)那么有 a/b=(a/b)×1=(a/b)

小坏蛋_千千 985

about乘法逆元

本博客部分摘自 hwim 定义 乘法逆元的定义:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元。b≡ a-1(mod p),a≡ b-1(mod p) 比如说, 在模7 意义下,3 的乘法逆元是5, 也可以说模7 意义下5的乘法逆元是3。模13意义下5的逆元是8 存在性 和同余方程很相似,在同余方...

agtvo48266的专栏 205

数论-乘法逆元

乘法逆元 [用途] 求解关于a/b(mod p)的问题 [介绍] 我们假设x为b的乘法逆元,可以将a/b(mod p)转化为ax(mod)p;根据乘法逆元的定义,在模p的意义下有:bx≡1 (mod) p 如果乘法逆元x存在,b,p一定互素! [适用条件] 当p为素数时,可以使用费马小定理求解 ...

2码8改 1112

逆元超详解

逆元是什么?有什么作用?怎么求逆元呢? 逆元的概念: 如果 a * x= 1 (mod p) 成立,那么 x 是 a 在 mod m 的条件下的逆元 注意,a和x一定都和p互质,如果不互质,则逆元不存在 逆元的用处: 计算a / b(mod p) 的值时,如果 b 是一个很大的数,那么会爆double的精度;假设除数 b 的逆元为 inv[b] ,那么可做如下转换 a / b (mod p) = a * inv[b](mod p) 把除法转变成了乘法,避免的精度的损失;为什么上述式子是等...

wait 2874
上一篇: 后缀自动机
下一篇: 虚树模板
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值