a的b次方
快速幂求a的b次方(取模)
快速幂的目的是为了做到快速求幂
求幂即把a连乘b次,一般来说时间复杂度为O(b)即为O(n)级别,但是快速幂能做到O(logn)
快速幂求x的n次方的方法:
代码如下:
#include <iostream>
using namespace std;
long long m(long long a,long long b)
{
long res=1;
while(b>0)
{
if(b & 1) res=res*a%1000;
a=a*a%1000;
b=b>>1;
}
return res;
}
int main()
{
int a,b;
while(cin >> a >> b && (a!=0&&b!=0))
{
cout << m(a,b)<< endl;
}
return 0;
}
斐波那契数列
利用矩阵快速幂计算
f[n] = f[n-1] + f[n-2],可以由f[0] = 0, f[1] = 1可以递推后面的所有数
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
struct matrix
{
long long m[2][2];
};
matrix ch(matrix a,matrix b)
{
matrix tmp;
memset(tmp.m,0,sizeof(tmp.m));
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
for(int k=0; k<2; k++)
tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%10000;
return tmp;
}
long long quickpow(matrix res,int m)
{
matrix ans;
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
if(i==j) ans.m[i][j]=1;
else ans.m[i][j]=0;
}
}
while(m)
{
if(m & 1) ans=ch(ans,res);
res=ch(res,res);
m >>= 1;
}
return ans.m[0][1]%10000;
}
int main()
{
int n;
matrix a;
a.m[0][0]=1;
a.m[0][1]=1;
a.m[1][1]=0;
a.m[1][0]=1;
while(cin >> n)
{
if(n==-1)
{
break;
}
cout << quickpow(a,n) << endl;
}
return 0;
}