zoukankan      html  css  js  c++  java
  • 对于一些小的数学的方法的一些记录

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


    • xmx(mod p)pPx^mequiv x(mod p)pinmathbb{P},且x[0,p1]xin[0,p-1]的满足条件的xx的个数。

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

    证明

    首先对于00所有情况都满足,所以先加个11

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

    然后因为pp为质数,那么可求一个它的原根,记为gg,我们根据原根的定义可知,当gkw(mod p),k[1,p1]g^kequiv w(mod p),kin[1,p-1],只有k=p1k=p-1w=1w=1,对于其他任何的kkww都不一样,所以我们可以将原式中的xx,转换为gyg^y,也就是xgy(mod p)xequiv g^y(mod p)

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

    欧拉定理:xyxy mod φ(p)(mod p)x^yequiv x^{y mod varphi(p)}(mod p)

    所以将指数提出,原式变成y(m1)0(mod (p1))y(m-1)equiv 0(mod (p-1)),然后由于m,p1m,p-1不一定互质,所以我们令k=gcd(p1,m1)k=gcd(p-1,m-1),原式可以变成ym1k0(mod p1k)yfrac{m-1}{k}equiv 0(mod frac{p-1}{k}),由于gcd(m1k,p1k)=1gcd(frac{m-1}{k},frac{p-1}{k})=1,所以这两个互质,那么同余为00只有yyp1kfrac{p-1}{k}的倍数,那么由于y[1,p1]yin[1,p-1]那么yy只有kk种选法,根据原根的定义,那么同理xx也有kk种,所以算上x=0x=0答案就为gcd(p1,m1)+1gcd(p-1,m-1)+1


    • xmx(mod n)xmx(mod pi)x^mequiv x(mod n)Leftrightarrow x^mequiv x(mod p_i),其中n=pin=prod p_i,且pip_i为质数并都不相同。

    证明

    这个相当于逆中国剩余定理,对于原式,我们可以写成xmk1n=xk2nx^m-k_1n=x-k_2n,那么将nn展开可得xmk1(pi)=xk2(pi)x^m-k_1(prod p_i)=x-k_2(prod p_i)

    然后我们对于每一个pjp_j,可以写出一个式子:
    xmk1(pi)xk2(pi)(mod pj)x^m-k_1(prod p_i)equiv x-k_2(prod p_i)(mod p_j)
    也就等价于xmx(mod pj)x^mequiv x(mod p_j)(因为减去的部分给模掉了)

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

    而当x[1,n]xin[1,n]时,令最终答案为ansans,假设这cc个同余式的每一个有cic_ixx满足,由于在范围内最多只会有一个xx满足ansans,所以在每个同余式中选出一个,那么最后就会有ciprod c_ixx满足原式,所以ansans的个数就为ciprod c_i


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

    证明

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


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

    内容:gcd(a,b)=gcd(a,ba)(ab)gcd(a,b)=gcd(a,b-a)(aleq b)

    可用于差分求区间gcdgcd询问修改。

    其它应用:高精gcdgcd的简便写法

    • aa偶数,bb奇数:gcd(a,b)=gcd(a2,b)gcd(a,b)=gcd(frac{a}{2},b)
    • aa奇数,bb偶数:gcd(a,b)=gcd(a,b2)gcd(a,b)=gcd(a,frac{b}{2})
    • aa奇数,bb奇数(bableq a):gcd(a,b)=gcd(ab,b)gcd(a,b)=gcd(a-b,b)
    • aa偶数,bb偶数:gcd(a,b)=2×gcd(a2,b2)gcd(a,b)=2 imes gcd(frac{a}{2},frac{b}{2})

    • 同余最短路

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

    a1x1+a2x2++anxn=ba_1x_1+a_2x_2+cdots+a_nx_n=b

    其中aia_i已知。

    1. 首先我们选取m=mini=1n{ai}m=minlimits_{i=1}^n{a_i},令其为模数,因为对于小于mm的除了x=0x=0,其它任何方案是组合不出来的,因为至少方程值都为mm,那么mod mmod m余数就是在0m10sim m-1内了。
    2. 我们枚举0m10 hicksim m-1,将每个数字(ai+w)mod m(a_i+w)mod m与枚举的数ww组合建边,边权为aia_i,表示当前数ww加上aia_i可以变成(ai+w)mod m(a_i+w)mod m
    3. 我们跑单源最短路,从00这个状态开始跑,求出每个状态点最小的能够满足它的值。
    4. 对于每个状态点,也就是枚举0m10 hicksim m-1中的点,我们知道最小的满足值,那么就可以求出在lrlsim r中有多少个在mod mmod 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
    ",ans);
    	return 0;
    }
    

    同余方程最小解

    对于求axm(mod p)axequiv m(mod p)的最小解xx,其中a,m,pa,m,p已知。

    首先我们令d=gcd(a,p)d=gcd(a,p),然后判断dmd|m,如果d̸md ot|m,那么该方程无解,否则,两端同时除以dd,变成adxmd(mod pd)frac{a}{d}xequiv frac{m}{d}(mod frac{p}{d}),然后由于adfrac{a}{d}pdfrac{p}{d}互质,所以可以求adfrac{a}{d}的逆元,把它除过去得到xma(mod pd)xequiv frac{m}{a}(mod frac{p}{d}),此时右边的mafrac{m}{a}为最小解xx

  • 相关阅读:
    BM&EXCRT
    杨丰磊
    poj3613 Cow Relays
    详解KMP算法
    信息学作文
    恐怖的奴隶主(bob)
    玩具(toy)
    杯子 (glass)
    P3916 图的遍历
    《上帝给我一个任务,叫我牵一只蜗牛去散步》
  • 原文地址:https://www.cnblogs.com/VictoryCzt/p/10053394.html
Copyright © 2011-2022 走看看