快速幂

思想理解下就很简单

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值