快速幂
#include<stdio.h> #define ll long long ll FastPower(ll a,ll b,int mod); int main() { ll a, b , mod; scanf("%lld %lld %lld",&a,&b,&mod); long long res = FastPower(a,b,mod); //res为a ^ b % mod 的结果 printf("%lld\n",res); return 0; } ll FastPower(ll a,ll b,int mod) { ll result=1; while(b) { if(b&1) result = (result * a) % mod; b>>=1; a = (a * a) % mod; } return result; }
矩阵快速幂
详解点击打开链接
?
#include<algorithm> #include<stdio.h> #include<string.h> #define ll long long using namespace std; const ll Mod =1000000009; struct Mat { int n, m; ll data[4][4]; }; Mat ans; Mat MatMul(Mat a, Mat b); Mat MatMod(Mat a, ll mod); //矩阵取模 Mat MatFastPoswer(Mat a, ll k, ll mod); int main() { int n,m; scanf("%d %d",&n, &m); //输入矩阵的行数和列数 Mat data; data.n = n; data.m = m; for(int i = 1; i <= n; i++) //输入矩阵。 { for(int j = 1; j <= m; j++) scanf("%lld",&data.data[i][j]); } ll k; //幂次 ll mod; scanf("%lld %lld",&k, &mod) ; Mat result = MatFastPoswer(data, k ,mod); for(int i = 1; i <= result.n; i++) //输出矩阵 { for(int j = 1; j <= result.m; j++) printf("%lld ",result.data[i][j]) ; printf("\n"); } return 0; } Mat MatFastPoswer(Mat a, ll k, ll mod) { int maxn = max(a.n,a.m); ans.n = ans.m = maxn; memset(ans.data, 0 , sizeof(ans.data)); for(int i =1; i <= ans.n; i++) ans.data[i][i] = 1; Mat res; res = a; while(k) { if(k & 1) ans = MatMod(MatMul(ans,res), mod); res = MatMod(MatMul(res, res), mod); k = k >> 1; } return ans; } Mat MatMul(Mat a, Mat b) { Mat temp ; temp.n = a.n, temp.m = b.m; for(int i = 1; i <= temp.n; i++) { for(int j =1; j <= temp.m; j++) { temp.data[i][j] = 0; for(int k = 1; k <= temp.m; k++) { temp.data[i][j] += (a.data[i][k] * b.data[k][j]); } } } return temp; } Mat MatMod(Mat a, ll mod) { Mat temp = a; for(int i = 1; i <= temp.n; i++) { for(int j = 1; j <= temp.m; j++) { temp.data[i][j] %= mod; } } return temp; }