对于一些小的数学的方法的一些记录

本文探讨了求解特定形式的同余方程的方法,包括求解(x^m equiv x mod p)的解的数量,以及如何求解同余方程的最小解。此外,还介绍了更相减损术求解最大公约数的技巧,以及如何通过构建图论模型解决复杂同余方程组的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里只是一些做题时用到的数学小技巧

  • x m ≡ x ( m o d   p ) p ∈ P x^m\equiv x(mod\ p)p\in\mathbb{P} xmx(mod p)pP,且 x ∈ [ 0 , p − 1 ] x\in[0,p-1] x[0,p1]的满足条件的 x x x的个数。

答案为 g c d ( m − 1 , p − 1 ) + 1 gcd(m-1,p-1)+1 gcd(m1,p1)+1个。

证明

首先对于 0 0 0所有情况都满足,所以先加个 1 1 1

然后对于 x ̸ = 0 x\not=0 x̸=0,而且 p p p为质数,所以 x x x肯定有逆元,所以我们将原式变形得到 x m − 1 ≡ 1 ( m o d   p ) x^{m-1}\equiv1(mod\ p) xm11(mod p)

然后因为 p p p为质数,那么可求一个它的原根,记为 g g g,我们根据原根的定义可知,当 g k ≡ w ( m o d   p ) , k ∈ [ 1 , p − 1 ] g^k\equiv w(mod\ p),k\in[1,p-1] gkw(mod p),k[1,p1],只有 k = p − 1 k=p-1 k=p1 w = 1 w=1 w=1,对于其他任何的 k k k w w w都不一样,所以我们可以将原式中的 x x x,转换为 g y g^y gy,也就是 x ≡ g y ( m o d   p ) x\equiv g^y(mod\ p) xgy(mod p)

所以原式就变成了 ( g y ) m − 1 ≡ 1 ( m o d   p ) (g^y)^{m-1}\equiv 1(mod\ p) (gy)m11(mod p),我们用欧拉定理对指数进行处理。

欧拉定理: x y ≡ x y   m o d   φ ( p ) ( m o d   p ) x^y\equiv x^{y\ mod\ \varphi(p)}(mod\ p) xyxy mod φ(p)(mod p)

所以将指数提出,原式变成 y ( m − 1 ) ≡ 0 ( m o d   ( p − 1 ) ) y(m-1)\equiv 0(mod\ (p-1)) y(m1)0(mod (p1)),然后由于 m , p − 1 m,p-1 m,p1不一定互质,所以我们令 k = g c d ( p − 1 , m − 1 ) k=gcd(p-1,m-1) k=gcd(p1,m1),原式可以变成 y m − 1 k ≡ 0 ( m o d   p − 1 k ) y\frac{m-1}{k}\equiv 0(mod\ \frac{p-1}{k}) ykm10(mod kp1),由于 g c d ( m − 1 k , p − 1 k ) = 1 gcd(\frac{m-1}{k},\frac{p-1}{k})=1 gcd(km1,kp1)=1,所以这两个互质,那么同余为 0 0 0只有 y y y p − 1 k \frac{p-1}{k} kp1的倍数,那么由于 y ∈ [ 1 , p − 1 ] y\in[1,p-1] y[1,p1]那么 y y y只有 k k k种选法,根据原根的定义,那么同理 x x x也有 k k k种,所以算上 x = 0 x=0 x=0答案就为 g c d ( p − 1 , m − 1 ) + 1 gcd(p-1,m-1)+1 gcd(p1,m1)+1


  • x m ≡ x ( m o d   n ) ⇔ x m ≡ x ( m o d   p i ) x^m\equiv x(mod\ n)\Leftrightarrow x^m\equiv x(mod\ p_i) xmx(mod n)xmx(mod pi),其中 n = ∏ p i n=\prod p_i n=pi,且 p i p_i pi为质数并都不相同。

证明

这个相当于逆中国剩余定理,对于原式,我们可以写成 x m − k 1 n = x − k 2 n x^m-k_1n=x-k_2n xmk1n=xk2n,那么将 n n n展开可得 x m − k 1 ( ∏ p i ) = x − k 2 ( ∏ p i ) x^m-k_1(\prod p_i)=x-k_2(\prod p_i) xmk1(pi)=xk2(pi)

然后我们对于每一个 p j p_j pj,可以写出一个式子:
x m − k 1 ( ∏ p i ) ≡ x − k 2 ( ∏ p i ) ( m o d   p j ) x^m-k_1(\prod p_i)\equiv x-k_2(\prod p_i)(mod\ p_j) xmk1(pi)xk2(pi)(mod pj)
也就等价于 x m ≡ x ( m o d   p j ) x^m\equiv x(mod\ p_j) xmx(mod pj)(因为减去的部分给模掉了)

加入有 c c c p i p_i pi,那么我们可以的到 c c c个同余式,将其分别解出,然后中国剩余定理合并一下,就可以得到原式的答案,所以当这些式子分别满足时,才能满足原式。

而当 x ∈ [ 1 , n ] x\in[1,n] x[1,n]时,令最终答案为 a n s ans ans,假设这 c c c个同余式的每一个有 c i c_i ci x x x满足,由于在范围内最多只会有一个 x x x满足 a n s ans ans,所以在每个同余式中选出一个,那么最后就会有 ∏ c i \prod c_i ci x x x满足原式,所以 a n s ans ans的个数就为 ∏ c i \prod c_i ci


  • 对于 n n n个点的完全图的生成树有 n n − 2 n^{n-2} nn2个,有根生成树为 n n − 1 n^{n-1} nn1个。

证明

用矩阵树或者prufer序列定理等证明就好啦我才不会告诉你我并不会证明╭(╯^╰)╮


  • 最大公约数的更相减损术

内容: g c d ( a , b ) = g c d ( a , b − a ) ( a ≤ b ) gcd(a,b)=gcd(a,b-a)(a\leq b) gcd(a,b)=gcd(a,ba)(ab)

可用于差分求区间 g c d gcd gcd询问修改。

其它应用:高精 g c d gcd gcd的简便写法

  • a a a偶数, b b b奇数: g c d ( a , b ) = g c d ( a 2 , b ) gcd(a,b)=gcd(\frac{a}{2},b) gcd(a,b)=gcd(2a,b)
  • a a a奇数, b b b偶数: g c d ( a , b ) = g c d ( a , b 2 ) gcd(a,b)=gcd(a,\frac{b}{2}) gcd(a,b)=gcd(a,2b)
  • a a a奇数, b b b奇数( b ≤ a b\leq a ba): g c d ( a , b ) = g c d ( a − b , b ) gcd(a,b)=gcd(a-b,b) gcd(a,b)=gcd(ab,b)
  • a a a偶数, b b b偶数: g c d ( a , b ) = 2 × g c d ( a 2 , b 2 ) gcd(a,b)=2\times gcd(\frac{a}{2},\frac{b}{2}) gcd(a,b)=2×gcd(2a,2b)

  • 同余最短路

对于如下方程,求取 b ∈ [ l , r ] b\in[l,r] b[l,r]中是的该方程有非负整数解的方案数。

a 1 x 1 + a 2 x 2 + ⋯ + a n x n = b a_1x_1+a_2x_2+\cdots+a_nx_n=b a1x1+a2x2++anxn=b

其中 a i a_i ai已知。

  1. 首先我们选取 m = min ⁡ i = 1 n { a i } m=\min\limits_{i=1}^n\{a_i\} m=i=1minn{ai},令其为模数,因为对于小于 m m m的除了 x = 0 x=0 x=0,其它任何方案是组合不出来的,因为至少方程值都为 m m m,那么 m o d   m mod\ m mod m余数就是在 0 ∼ m − 1 0\sim m-1 0m1内了。
  2. 我们枚举 0 ∼ m − 1 0\thicksim m-1 0m1,将每个数字 ( a i + w ) m o d   m (a_i+w)mod\ m (ai+w)mod m与枚举的数 w w w组合建边,边权为 a i a_i ai,表示当前数 w w w加上 a i a_i ai可以变成 ( a i + w ) m o d   m (a_i+w)mod\ m (ai+w)mod m
  3. 我们跑单源最短路,从 0 0 0这个状态开始跑,求出每个状态点最小的能够满足它的值。
  4. 对于每个状态点,也就是枚举 0 ∼ m − 1 0\thicksim m-1 0m1中的点,我们知道最小的满足值,那么就可以求出在 l ∼ r l\sim r lr中有多少个在 m o d   m mod\ m mod m的意义下等于它,统计计入答案即可。
墨墨的等式[国家集训队]-luogu
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e6+10;
int n;
ll Bs,Bt,inf,minv,A[N],up;
struct ss{
	int to,last;ll len;
	ss(){}
	ss(int a,int b,ll c):to(a),last(b),len(c){}
}g[N<<1];
int head[N],cnt;
void add(int a,int b,ll c){
	if(a==b) return;
	up=max(up,(ll)max(a,b));
	g[++cnt]=ss(b,head[a],c);head[a]=cnt;
}

struct node{
	ll val;int id;
	node(){}
	node(ll a,int b):val(a),id(b){}
	bool operator <(const node &a)const{return val>a.val;}
};

ll dis[N];
priority_queue <node> Q;

void dij(){
	memset(dis,0x3f,sizeof(dis));
	inf=dis[0];
	dis[0]=0;Q.push(node(0,0));
	while(!Q.empty()){
		node now=Q.top();Q.pop();
		int a=now.id,v;
		if(now.val>dis[a]) continue;
		for(int i=head[a];i;i=g[i].last){
			v=g[i].to;
			if(dis[v]>dis[a]+g[i].len){
				dis[v]=dis[a]+g[i].len;
				Q.push(node(dis[v],v));
			}
		}
	}
}
ll ans;
ll calc(ll v,ll low){
	return (Bt-v+minv)/minv-(low-1ll-v+minv)/minv;
}
int main(){
	scanf("%d%lld%lld",&n,&Bs,&Bt);
	minv=1e9;
	for(int i=1;i<=n;i++)scanf("%lld",&A[i]),minv=min(minv,A[i]);
	for(int i=1;i<=n;i++){
		for(int j=0;j<minv;j++){
			int p=(A[i]+j)%minv;
			add(j,p,A[i]);
		}
	}
	dij();
	for(int i=0;i<minv;i++){
		if(dis[i]==inf)continue;
		ll now=max(dis[i],Bs);
		if(now>Bt) continue;
		ans+=calc(i,now);
	}
	printf("%lld\n",ans);
	return 0;
}

同余方程最小解

对于求 a x ≡ m ( m o d   p ) ax\equiv m(mod\ p) axm(mod p)的最小解 x x x,其中 a , m , p a,m,p a,m,p已知。

首先我们令 d = g c d ( a , p ) d=gcd(a,p) d=gcd(a,p),然后判断 d ∣ m d|m dm,如果 d ̸ ∣ m d\not|m d̸m,那么该方程无解,否则,两端同时除以 d d d,变成 a d x ≡ m d ( m o d   p d ) \frac{a}{d}x\equiv \frac{m}{d}(mod\ \frac{p}{d}) daxdm(mod dp),然后由于 a d \frac{a}{d} da p d \frac{p}{d} dp互质,所以可以求 a d \frac{a}{d} da的逆元,把它除过去得到 x ≡ m a ( m o d   p d ) x\equiv \frac{m}{a}(mod\ \frac{p}{d}) xam(mod dp),此时右边的 m a \frac{m}{a} am为最小解 x x x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VictoryCzt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值