扩展欧几里得
求二元一次不定方程的一组解。
当时,有一组解 ;
当时,因为 ,
所以设满足,
则 ,
整理得 。
所以。
就可以在求gcd的过程中得到一组解。
inline int exgcd(int a,int b,int &x,int &y){ if(!b){ x=1;y=0;return a; } else{ int ret=exgcd(b,a%b,y,x); y-=a/b*x;return ret; } }
欧拉函数
欧拉函数的定义:小于等于的正整数中与互质的数的个数。
当时,;
当时,可以写成个素数的幂的积的形式,第个素数的质数为:
根据容斥原理得,。
简单地推一下后发现,。
BSGS
求最小的使得为质数。
令 ,则,即。
将所有的用存起来,从小到大枚举,直到是某个,
此时答案为。
由费马小定理可得,,所以 ,
所以可以用快速幂实现除法(时会有)。
typedef long long ll; map<ll,ll> m; inline ll po(ll x,ll k,ll p){ ll ret=1; while(k){ if(k&1) ret=ret*x%p; x=x*x%p;k>>=1; } return ret; } inline ll bsgs(ll a,ll b,ll p){ if(gcd(a,p)!=1) return -1;
ll s=sqrt(p),k=1,x=1,y; while(s*s<=p) ++s; for(ll i=0;i<s;++i){ if(!m[k]) m[k]=i;
k=k*a%p; } for(ll i=0;i<s;++i){ y=b*po(x,p-2,p)%p; if(m.count(y)) return i*s+m[y]; x=x*k%p; } return -1; }
时间: 2024-12-13 14:12:51