这个是用一个原根和指标法求下一个原根。
and
取模的另一种写法:
ax + by = d ≡ bx + (a%b)y = d,根据恒等式,找出相邻状态的关系↓
依据恒等式对应参数系数相等,得出x = y1 y = x1 - a/b X y1,其中a/b是计算机除法运算
扩展欧几里得代码(细节在代码里注释了)
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){
x = 1;
y = 0;
return a;
}
int r = exgcd(b,a%b,x,y);
int t = x; x = y ; y = t - a / b * y;
return r;
}
///对于ax+by = d(d = gcd(a,b))的特解x0 = y1 , y0 = x0 - a/b * y0;
///所以扩展欧几里得是用来得到d=gcd(a,b)与特解x0,y0的
///所以通解为x = x0 + k(b/d) y = y0 - k(a/d);///这里应该是分数形式
///那么对于方程ax+by= c 就可以直接写出通解
///x = c/d * x0 + k(b/d) y = c/d * y0 - k(a/d);
int main()
{
return 0;
}
逆元概念
C = A/B 求 C%p;不难,仔细推敲一下即可得出
线性预处理逆元:求出1~n中i号元素的逆元。直接记代码
// p 必须为质数,p / i 为整除。
inv[1] = 1;
for (int i = 2; i <= n; ++i) {
inv[i] = (p - p / i) * inv[p % i] % p;
}