快速幂
-
数的快速幂;
计算x^n,n=10000000
递归算法
intpow(int x,int n)
{
if(n==1)
return x;
else if(n%2==1)
{
return x*pow(x,n/2);
}
else
{
return pow(x,n/2);
}
}
非递归算法
intpow(int x,int n)
{
int temp=1;
if(n%2==1)
{
temp*=x;
n-=1;
}
while(n)
{
x=x*x;
n/=2;
}
return x;
}
-
矩阵快速幂
1*.矩阵乘法的实现;
structasd{
int a[N][N];
};
asdcheng(asd q,asd w,int n)
{
asd r;
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
r.a[i][j]=0;
for(k=0;k<n;k++)
{
r.a[i][j]+=q.a[i][k]*w.a[k][j];
}
}
}
return r;
}
2*.类比于数的快速幂做出矩阵的快速幂
#include <stdio.h>
#include <string.h>
#define Matr 110 //矩阵大小
struct mat//矩阵结构体
{
inta[Matr][Matr];
mat()//构造函数
{
memset(a,0,sizeof(a));
}
};
int Size,mod;
mat multi(mat m1,mat m2)//两个相等矩阵的乘法
{
mat ans=mat();
for(inti=0;i<Size;i++)
for(intj=0;j<Size;j++)
for(intk=0;k<Size;k++)
ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%mod;
return ans;
}
mat quickmulti(mat m,int n)//二分快速幂
{
mat ans=mat();
int i;
for(i=0;i<Size;i++)ans.a[i][i]=1;
while(n)
{
if(n&1)ans=multi(m,ans);
m=multi(m,m);
n>>=1;
}
return ans;
}
void print(mat m)//输出矩阵信息
{
int i,j;
printf("%d\n",Size);
for(i=0;i<Size;i++)
{
for(j=0;j<Size;j++)
printf("%d ",m.a[i][j]);
printf("\n");
}
}
int main()
{
int n,p;
while(~scanf("%d%d",&n,&p))
{
matA;
for(inti=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&A.a[i][j]);
Size=n;
mod=p;
A=quickmulti(A,n);
print(A);
}
return 0;
}
-------斐波那契前四位(主要代码),用公式做的————不知道百度
doublet1=log10((double)(1.0+sqrt(5.0))/2);
double t2=log10(sqrt(5.0));
double t;
int ans1;
t=n*t1-t2;
t=t-(int)t;
ans1=pow(10.0,t)*1000;
printf("%d\n",ans1);
------矩阵的一些变换