矩阵相乘求快速幂
如果不懂矩阵相乘的话就去看矩阵相乘求斐波那契
然后说快速幂
依据乘法原理 2的2次方*2的6次方 就是2的(2+6)次方
所以说如果用快速幂就可以大幅减少运行次数来提高程序效率
比如说2的100次方
1100100 看到上面从右数第3位,第6,第7位有一个1
然后2的3-1次方(因为最后一位是0次方也就是1)是4
2的6次方是32
2的7次方是64
#include<cstdio>
using namespace std;
int main()
{
int a,b,c,x,s=1,l=0;
scanf("%d%d%d",&x,&b,&c);
while(b>0)
{
if(b%2==1) s=(s*(long long)x)%c;
b/=2;
x=(x*(long long)x)%c;
}
cout<<s;
system("pause");
return 0;
}
一个非常简单的基础快速幂
用x的b次方模c
然后也就是优化 一般我们会选择用矩阵相乘来优化
#include<cstdio>
#include<iostream>
using namespace std;
};
Matrix operator* (Matrix a, Matrix b) {
Matrix y;
for (int i=0; i<2; i++)
for (int j=0; j<2; j++) {
y.m[i][j] = 0;
for (int k=0; k<2; k++)
y.m[i][j]=(y.m[i][j]+a.m[i][k]*(long long)b.m[k][j])%P;
}
return y;
}
x.m[0][0] = 1;
x.m[0][1] = 1;
x.m[1][0] = 1;
x.m[1][1] = 0;
int n;
scanf("%d", &n);
Matrix s;
s.m[0][0] = 1;
s.m[0][1] = 0;
s.m[1][0] = 0;
s.m[1][1] = 1;
while (n > 0) {
if (n % 2 == 1)
s = s * x;
n /= 2;
x = x * x;
}
printf("%d\n", (s.m[1][0] + s.m[1][1]) % P);
system("pause");
}
如果不懂矩阵相乘的话就去看矩阵相乘求斐波那契
然后说快速幂
依据乘法原理 2的2次方*2的6次方 就是2的(2+6)次方
所以说如果用快速幂就可以大幅减少运行次数来提高程序效率
比如说2的100次方
1100100 看到上面从右数第3位,第6,第7位有一个1
然后2的3-1次方(因为最后一位是0次方也就是1)是4
2的6次方是32
2的7次方是64
加起来 32+64+4就是100 所以说只要把这几个乘起来就好了
#include<cstdio>
using namespace std;
int main()
{
int a,b,c,x,s=1,l=0;
scanf("%d%d%d",&x,&b,&c);
while(b>0)
{
if(b%2==1) s=(s*(long long)x)%c;
b/=2;
x=(x*(long long)x)%c;
}
cout<<s;
system("pause");
return 0;
}
一个非常简单的基础快速幂
用x的b次方模c
然后也就是优化 一般我们会选择用矩阵相乘来优化
#include<cstdio>
#include<iostream>
using namespace std;
const int P = 1000000007;
struct Matrix
{
long long m[2][2];};
Matrix operator* (Matrix a, Matrix b) {
Matrix y;
for (int i=0; i<2; i++)
for (int j=0; j<2; j++) {
y.m[i][j] = 0;
for (int k=0; k<2; k++)
y.m[i][j]=(y.m[i][j]+a.m[i][k]*(long long)b.m[k][j])%P;
}
return y;
}
int main()
{
Matrix x;x.m[0][0] = 1;
x.m[0][1] = 1;
x.m[1][0] = 1;
x.m[1][1] = 0;
int n;
scanf("%d", &n);
Matrix s;
s.m[0][0] = 1;
s.m[0][1] = 0;
s.m[1][0] = 0;
s.m[1][1] = 1;
while (n > 0) {
if (n % 2 == 1)
s = s * x;
n /= 2;
x = x * x;
}
printf("%d\n", (s.m[1][0] + s.m[1][1]) % P);
system("pause");
}
矩阵相乘求快速幂