思想理解下就很简单
51nod上面有三四题
简单的有 HDU - 1061
其中一道题就是.......N^N 他们的末位四个一循环 涨知识了
这是基本快速幂基本模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll quik_mod(ll a,ll b,ll c)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%c;
a=(a*a)%c;
b=b>>1;
}
return ans;
}
int main()
{
ll a,b,c;
cin>>a>>b>>c;
cout<<quik_mod(a,b,c)<<endl;
return 0;
}
这个是快速幂优化版本
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll more_quik(ll a,ll b,ll c)
{
ll ans=0;
while(b)
{
if(b&1) ans=(ans+a)%c;
a=(a+a)%c;
b=b>>1;
}
return ans;
}
ll quik_mod(ll a,ll b,ll c)
{
ll ans=1;
while(b)
{
if(b&1) ans= more_quik(ans,a,c);
a=more_quik(a,a,c);
b=b>>1;
}
return ans;
}
int main()
{
ll a,b,c;
cin>>a>>b>>c;
cout<<quik_mod(a,b,c)<<endl;
return 0;
}
还有矩阵快速幂
入门题目:
B - 矩阵快速幂 CodeForces - 450B
题解 因为由于公式 可以推得f[i+1]=f[i]-f[i-1]
(f[i],f[i-1])* (1, 1 )的超级大括号的n-3次方 经过发现可以看到的就是 f(3)= f(2)-f(1)其实相当于直接算的
(-1,0) 只要两个矩阵相乘就行
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1000000007;
ll x,y,n;
struct node
{
ll kk[4][4];
}a,b,gg,xx;
node pow_Maxrix(node a ,node b)
{
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
xx.kk[i][j]=0;//初始化
for(int k=1;k<=2;k++)
{
xx.kk[i][j]+=a.kk[i][k]*b.kk[k][j];
xx.kk[i][j]%=MOD;
}
}
}
return xx;
}
void Maxrix()
{
ll m=n-3;
while(m)
{
if(m&1)
gg = pow_Maxrix(gg,a);
m=m>>1;
a = pow_Maxrix(a,a);
}
}
int main()
{
scanf("%lld%lld%lld",&x,&y,&n);
if(n==1)
printf("%lld\n",(x+MOD)%MOD);
else if(n==2)
printf("%lld\n",(y+MOD)%MOD);
else
{
//这是构造出来的矩阵
gg.kk[1][1]=gg.kk[1][2]=a.kk[1][2]=a.kk[1][1]=1;
a.kk[2][1]=gg.kk[2][1]=-1;
a.kk[2][2]=gg.kk[2][2]=0;
Maxrix();
ll ans=(y*gg.kk[1][1]+x*gg.kk[2][1])%MOD;
if(ans<0)ans=ans+MOD;
printf("%lld\n",ans);
}
return 0;
}