记录平时遇到的一些知识点。
阶:设\(a,p\)是整数且互质,那么满足\(a^n=1\mod p\)的最小整数\(n\)就称为\(a\)模\(p\)的阶。
原根:当\(a\)模\(m\)的阶为\(\varphi(m)\)时,就称\(a\)为模\(m\)的一个原根。
快速求原根:得到\(m-1\)的所有质因子\(p_1,p_2,\cdots,p_k\),从小到达枚举\(i\),若满足\(i^\frac{m-1}{p_j}\mod m =1\),则\(i\)不为原根。证明可通过裴蜀定理来证明,详见:传送门
\[
\left(\frac{a}{p}\right) \equiv \left\{
\begin{aligned}
&1,a是模p的二次剩余且p不整除a\&-1,a是模p的非二次剩余\&0,p|a\\end{aligned}
\right.
\]
证明可参见:传送门
代码:
Code
//求解x^2=n(mod p)
const int moder = (int) 1e9 + 7;
const int inv2 = (moder + 1) / 2;
struct field2{
int x, y, a, p;
field2():x(0), y(0), a(0), p(0){}
field2(int x, int y, int a, int p):x(x), y(y), a(a), p(p){}
field2 operator *(const field2 &f)const{
int retx = (1ll * x * f.x + 1ll * y * f.y % p * a) % p;
int rety = (1ll * x * f.y + 1ll * y * f.x) % p;
return field2(retx, rety, a, p);
}
field2 powermod(int exp)const{
field2 ret(1, 0, a, p), aux = *this;
for ( ; exp > 0; exp >>= 1){
if (exp & 1){
ret = ret * aux;
}
aux = aux * aux;
}
return ret;
}
};
int powermod(int a, int exp, int moder){
int ret = 1;
for ( ; exp; exp >>= 1){
if (exp & 1){
ret = 1ll * ret * a % moder;
}
a = 1ll * a * a % moder;
}
return ret;
}
int randint(int n){
return rand() % n;
}
vector <int> remain2(int a, int p){ //x^2 = a (mod p)
if (!a || p == 2){ //特判
return {a, a};
}
if (powermod(a, p - 1 >> 1, p) != 1){ //欧拉准则
return {};
}
while (true){
field2 f(randint(p - 1) + 1, randint(p - 1) + 1, a, p);
f = f.powermod(p - 1 >> 1);
if (f.x){
continue;
}
int ret = powermod(f.y, p - 2, p);
return {ret, p - ret};
}
}
求\(\sum_{i=0}^{n}\lfloor\frac{ai+b}{c}\rfloor\).
推导过程如下:
因为每次\((a,c)\)变为了\((c,a\%c)\),所以复杂度为\(O(logn)\)。
直观点来理解类欧的话,所求式子就是求一条直线为\(x,y\)轴所围成的梯形内部的整点个数。我们的做法就是首先将直线斜率变平缓,然后变换坐标系...依次处理下去,最后肯定直线斜率会趋近于\(0\)。
附上模板:
Code
const int MOD = 1000000007, inv2 = (MOD + 1) / 2;
ll f(ll n, ll a, ll b, ll c) {
//sum_{i=0}^n (ai+b)/c
if(a <= 0) return 0;
if(a >= c || b >= c) {
return (n * (n + 1) % MOD * inv2 % MOD * (a / c) % MOD
+ (n + 1) * (b / c) % MOD + f(n, a % c, b % c, c)) % MOD;
}
ll m = (a * n + b) / c;
return (m * n % MOD - f(m - 1, c, c - b - 1, a) + MOD) % MOD;
}
当然类欧还能解决其它的问题,我就不详细展开了~
原文:https://www.cnblogs.com/heyuhhh/p/11366441.html