快速幂 & 快速乘法算(a * b) % c
普通快速幂
long long montgomery(long long a, long long n, long long c){
long long ans = 1;
a = a % c;
while(n){
if(n & 1)ans = (ans * a) % c;
n = n >> 1;
a = (a * a) % c;
}
return ans;
}
矩阵快速幂——算矩阵\(A^b\)
typedef int arr[10][10];
void cheng(arr y, arr x){
memset(z, 0, sizeof(z));
for(int i = 1; i <= n; i ++)
for(int j = 1; j<= n; j ++)
for(int k = 1; k <= n; k ++)
z[i][j] += y[i][k] * x[k][j];
memcpy(y, z, sizeof(z));
}
void Montgomery(int b){
for(int i = 1; i<= n; i ++)ans[i][i] = 1;//单位矩阵
while(b > 0) {
if(b & 1)cheng(ans, A);
b = b >> 1;
cheng(A, A);
}
}
快速乘法
long long cheng(long long a, long long b, long long c){
long long ans = 0;
while(b){
if(b & 1)ans = (ans + a) % c;
b = b >> 1;
a = (a << 1) % c;
}
return ans;
}
O(1)快速乘
inline LL KSC(LL a, LL b){
return (a*b-(LL)((long double)a/p*b)*p+p)%p;
}
主要用于a*b的值超long long,而(a*b)%c不超long long的情况,用来避免写高精度
梦里如昨,此身似我非我
冷雾割风寒浸骨,意沉南柯

浙公网安备 33010602011771号